php - 如何为每个 echo 获取回调?

标签 php output-buffering

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

最佳答案

事实证明答案其实很简单。将 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/

相关文章:

php - PHP/Apache 中的输出缓冲 block 如何工作?

PHP 输出缓冲

php - 输出缓冲区如何降低性能

php - CentOS Linux 版本 8.0.1905 未更改 php.ini

php - 如何对此上下文建模,以便有可能创建自定义问题并收集答案?

用于数学运算的 PHP 正则表达式

php - 如何通过 PHP 在 HTML 按钮上添加 CSS 类

javascript - 联系表 7 - 提交时设置 Cookie

python - Emacs/Python : running python-shell in line buffered vs. block 缓冲模式

javascript - 使用 Javascript 阻止表单操作发生