在CLI中使用输出缓冲时打印到终端PHP脚本
问题描述:
我正在使用命令行PHP来离线创建一些文件。要捕获脚本输出,可以使用标准的ob_start东西:在CLI中使用输出缓冲时打印到终端PHP脚本
ob_start();
// Echo lots of stuff
$content = ob_get_contents();
// Now the $content can be written to a file
不过,我也想打印一些信息到终端(例如,警告)而收集“主输出”到缓冲区。有没有办法做到这一点?似乎不可能暂停缓冲一会儿来打印终端消息,然后从剩下的地方继续缓冲。有没有解决方法?
答
只写stdout或stderr(含文件指针资源既常数)使用fputs():
ob_start();
echo 'Output buffer';
fputs(STDOUT, "Log message");
$x = ob_get_contents();
ob_end_clean();;
echo "X = $x";
答
使用php://stderr
流:
$f = fopen('php://stderr', 'w');
fputs($f, 'Output');
编辑:此外,在CLI,有一个predefined STDERR constant:
fputs(STDERR, 'Output');
答
可以“暂停”输出缓冲区。将缓冲区的内容写入变量,并在不刷新的情况下结束缓冲区。写一些非缓冲输出,并再次调用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;
?>