在CLI PHP脚本中使用输出缓冲时打印到终端

时间:2009-08-31 07:42:32

标签: php command-line

我正在使用命令行PHP来离线构建一些文件。要捕获脚本输出,我使用标准的ob_start:

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

但是,我还想将一些消息打印到终端(例如,警告),而将“主输出”收集到缓冲区中。有没有办法做到这一点?似乎暂时不能暂停缓冲以打印终端消息,然后从剩下的位置继续缓冲。有没有解决方法呢?

3 个答案:

答案 0 :(得分:8)

使用fputs()写入STDOUT或STDERR(两个包含文件指针资源的常量):

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

echo "X = $x";

答案 1 :(得分:6)

使用php://stderr信息流:

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

编辑另外,在CLI中,有一个predefined STDERR constant

fputs(STDERR, 'Output');

答案 2 :(得分: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;
?>