Php 如何获取每个回显的回调?

Php 如何获取每个回显的回调?,php,output-buffering,Php,Output Buffering,我想通过处理任何回音来使用输出缓冲来使我的日志更漂亮,但是ob\u start和ob\u implicit\u flush似乎并没有按照我的想法工作。以下是我正在尝试的内容(这是一个cli脚本): 但我得到的是 x derpflurp 3秒后。有没有办法为每个回音获取回调,这样我就可以处理内容,然后立即输出?事实证明,答案其实很简单。将1作为第二个参数传递给ob_start(在PHP5.4+中,1在此之前有一个特殊的含义,因此我想使用2): 我不知道那是怎么回事。在?>之后没有任何尾随空格,因

我想通过处理任何回音来使用输出缓冲来使我的日志更漂亮,但是
ob\u start
ob\u implicit\u flush
似乎并没有按照我的想法工作。以下是我正在尝试的内容(这是一个cli脚本):

但我得到的是

x derpflurp

3秒后。有没有办法为每个回音获取回调,这样我就可以处理内容,然后立即输出?

事实证明,答案其实很简单。将
1
作为第二个参数传递给
ob_start
(在PHP5.4+中,
1
在此之前有一个特殊的含义,因此我想使用
2
):

我不知道那是怎么回事。在
?>
之后没有任何尾随空格,因为我甚至没有放置结束标记

如果条件为:

ob_start(function($s) {
    if($s !== '') {
        return "x $s\n";
    }
},1);
输出回调 ... 当输出缓冲区被刷新(发送)或清理(使用ob_flush()、ob_clean()或类似函数)时,将调用该函数


因此,您只能在结束(end_flush())后获得整个输出。

您可以通过在调用之间强制刷新来获得所需的结果

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

是的,我希望
ob\u implicit\u flush(true)
会在每次回显后导致刷新,如描述所示:“隐式刷新将在每次输出调用后导致刷新操作,因此不再需要对flush()的显式调用。”我希望避免显式刷新。如果我每次都想刷新,我会编写一个自定义函数忘记这个ob无意义:-)我使用了几种方法,但是如果没有显式刷新,它就不会工作。你不能删除
ob\u flush()
?有一种方法。我找到了解决办法。看看我的答案:-)在最后可能会自动刷新输出缓冲区,即使缓冲区是空的。我想是这样的。但是用空字符串调用回调似乎有些奇怪。在PHP5.4.0之前,值1是一个特殊的大小写值,它将块大小设置为4096字节。这只有在您知道块大小的情况下才有效,这可能很难确定。
<?php

ob_start(function($s) {
    if($s !== '') {
        return "x $s\n";
    }
},1);


echo 'derp';

echo 'flurp';

sleep(3);

ob_end_flush();
x derp
x flurp
x 
ob_start(function($s) {
    if($s !== '') {
        return "x $s\n";
    }
},1);
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();