2009-08-31 66 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; 
?>