CLI PHP scipts çıktı tamponlama kullanırken terminaline yazdırma

3 Cevap php

Ben çevrimdışı bazı dosyaları oluşturmak için komut satırı PHP kullanıyorum. Ben standart ob_start malzeme kullanmak komut çıkış yakalamak için:

ob_start();
// Echo lots of stuff
$content = ob_get_contents();
// Now the $content can be written to a file

Ancak, ben de while tampon içine "ana çıkış" toplama (örneğin, uyarılar) terminaline bazı mesajları yazdırmak istiyorum. Bunu yapmak için bir yolu var mı? Bu terminali mesajları yazdırmak için bir süre tamponlama duraklama ve daha sonra kaldığı yerden devam tamponlama mümkün görünmüyor. Bunun için herhangi bir çözüm var mı?

3 Cevap

Sadece (dosya işaretçisi kaynakları içeren iki sabiti) fputs kullanılarak STDOUT veya STDERR yazmak ():

ob_start();
echo 'Output buffer';
fputs(STDOUT, "Log message");
$x = ob_get_contents();
ob_end_clean();;

echo "X = $x";

: php://stderr akışı kullanın

$f = fopen('php://stderr', 'w');
fputs($f, 'Output');

EDIT: Ayrıca, CLI, olduğu bir predefined STDERR constant,

fputs(STDERR, 'Output');

Bu 'pause' bir çıkış tampon mümkündür. Bir değişkene tampon içeriğini yazmak ve kızarma olmadan tampon sonunda. Olmayan bazı tamponlu çıkışı yazın ve tekrar () ob_start diyoruz. Bu yöntem, dize birleştirme kullanır ve nispeten kirli yöntem. Ben bu nedenle benim kendi yukarıdaki diğer yöntemleri tercih ediyor.

Ama her iki durumda da, burada bir küçük, çalışan bir örnektir:

<?php
ob_start();
	echo 'Buffered line 1.<br>';
$ob = ob_get_contents();
ob_end_clean();

echo 'Non-buffered line.<br>';

ob_start();
	echo 'Buffered line 2.<br>';
$ob .= ob_get_contents();
ob_end_clean();

echo 'Non-buffered line.<br>';

ob_start();
	echo 'Buffered line 3.<br>';
$ob .= ob_get_contents();
ob_end_clean();

echo 'Non-buffered line.<br>';

echo $ob;
?>