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