我想通过处理任何回声来使用输出缓冲来使我的日志更漂亮,但ob_start
和ob_implicit_flush
似乎并不像我想的那样工作。这就是我正在尝试的(这是一个cli脚本):
<?php
ini_set("zlib.output_compression", 0);
ini_set("implicit_flush", 1);
ob_implicit_flush(true);
ob_start(function($s) {
return "x $s\n";
});
echo 'derp';
echo 'flurp';
sleep(3);
ob_end_flush();
我想要的输出是
x derp
x flurp
但我得到的是
x derpflurp
3秒后。有没有办法获得每个回调的回调,以便我可以处理内容,然后立即输出?
答案 0 :(得分:2)
原来答案其实很简单。将1
作为ob_start
的第二个参数传递(在PHP 5.4+中,1
之前有特殊含义,所以我猜使用2
):
<?php
ob_start(function($s) {
if($s !== '') {
return "x $s\n";
}
},1);
echo 'derp';
echo 'flurp';
sleep(3);
ob_end_flush();
ob_implicit_flush
不需要,似乎没有做任何事情。
虽然我现在在输出结束时得到额外的x
(在3秒钟之后):
x derp
x flurp
x
我不确定那是什么意思。在?>
之后不存在任何尾随空格,因为我甚至没有添加结束标记....
可以使用if
条件修复此问题:
ob_start(function($s) {
if($s !== '') {
return "x $s\n";
}
},1);
答案 1 :(得分:0)
output_callback ...当刷新(发送)或清除输出缓冲区(使用ob_flush(),ob_clean()或类似函数)时,将调用该函数... ...
所以你只能在结束后得到整个输出(end_flush())
答案 2 :(得分:0)
您可以通过在呼叫之间强制刷新来获得所需的结果
ob_implicit_flush(true);
ob_start(function($s) {
return "x $s\n";
});
echo 'derp';
ob_get_contents();
ob_flush();
echo 'flurp';
sleep(3);
ob_end_flush();