我想使用输出缓冲通过处理任何 echo 来使我的日志更漂亮,但是 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秒后。有没有办法获得每个回显的回调,以便我可以处理内容然后立即输出?
最佳答案
事实证明答案其实很简单。将 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);
关于php - 如何为每个 echo 获取回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30113456/