我正在使用命令行PHP来离线构建一些文件。要捕获脚本输出,我使用标准的ob_start:
ob_start();
// Echo lots of stuff
$content = ob_get_contents();
// Now the $content can be written to a file
但是,我还想将一些消息打印到终端(例如,警告),而将“主输出”收集到缓冲区中。有没有办法做到这一点?似乎暂时不能暂停缓冲以打印终端消息,然后从剩下的位置继续缓冲。有没有解决方法呢?
答案 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;
?>