2009-08-31 65 views
6

我正在使用命令行PHP來離線創建一些文件。要捕獲腳本輸出,可以使用標準的ob_start東西:在CLI中使用輸出緩衝時打印到終端PHP腳本

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

不過,我也想打印一些信息到終端(例如,警告)收集「主輸出」到緩衝區。有沒有辦法做到這一點?似乎不可能暫停緩衝一會兒來打印終端消息,然後從剩下的地方繼續緩衝。有沒有解決方法?

回答

8

只寫stdout或stderr(含文件指針資源既常數)使用fputs():

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

echo "X = $x"; 
5

使用php://stderr流:

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

編輯:此外,在CLI,有一個predefined STDERR constant

fputs(STDERR, 'Output'); 
2

可以「暫停」輸出緩衝區。將緩衝區的內容寫入變量,並在不刷新的情況下結束緩衝區。寫一些非緩衝輸出,並再次調用ob_start()。這種方法使用字符串連接,這是一個相對較髒的方法。出於這個原因,我更喜歡我自己以上的其他方法。

但在這兩種情況下,這裏有一個小的工作示例:

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