如何获得每个回声的回调?

时间:2015-05-07 23:40:53

标签: php output-buffering

我想通过处理任何回声来使用输出缓冲来使我的日志更漂亮,但ob_startob_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秒后。有没有办法获得每个回调的回调,以便我可以处理内容,然后立即输出?

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();