2009-08-31 18 views
6

Çevrimdışı bazı dosyalar oluşturmak için PHP komut satırını kullanıyorum.CLI PHP komut dosyalarında çıktı arabellek kullanırken terminalde yazdırma

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

Ancak, ben de tampon içine "ana çıktı" toplama ise (örneğin uyarıları) terminale bazı iletileri yazdırmak istiyorum: Ben standart ob_start şeyler kullanmak komut çıktısını yakalamak için. Bunu yapmanın bir yolu var mı? Terminal mesajlarını yazdırmak için bir süreliğine arabelleği duraklatmak mümkün görünmüyor ve ardından arabelleği kaldığı yerden devam ettiriliyor. Bunun için bir çözüm var mı?

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

DÜZENLEME: Ayrıca CLI, bir predefined STDERR constant vardır:

cevap

8

Sadece (STDOUT veya standart hataya yazma dosya işaretçisi kaynaklarını içeren her iki sabitler) fputs kullanarak():

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

echo "X = $x"; 
5

php://stderr akış kullanın

fputs(STDERR, 'Output'); 
2

Bir çıktı tamponunu 'duraklatmak' mümkündür. Tamponun içeriğini bir değişkene yazın ve tamponu boşaltmadan sonlandırın. Bazı tamponlanmamış çıktıları yazın ve ob_start() öğesini tekrar arayın. Bu yöntem, dize birleştirme kullanır ve nispeten kirli bir yöntemdir. Bu sebepten ötürü diğer yöntemleri tercih ederim.

<?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; 
?> 
:

Ama her iki durumda da

, burada küçük bir çalışma örneği
İlgili konular