【问题标题】:PHP output buffering throwing warningsPHP 输出缓冲抛出警告
【发布时间】:2018-08-09 11:54:03
【问题描述】:

我必须在 PHP 脚本运行时输出结果:

ob_implicit_flush(true);
ob_start();
for ($i=0; $i<5; $i++) {
    echo $i . ' - ';
    ob_end_flush();
    flush();
    sleep(1);
}

这是有效的,但会引发警告:

注意:ob_end_flush():删除和刷新缓冲区失败。无缓冲 删除或刷新...

如何解决?

【问题讨论】:

  • 三思而后行。
  • 你应该只在最后调用一次ob_end_flush()

标签: php output-buffering


【解决方案1】:

在第一个循环中,您将结束缓冲区。如果你想这样做,你应该在每个循环中启动一个新的缓冲区。

ob_implicit_flush(true);
for ($i=0; $i<5; $i++) {
    ob_start();
    echo $i . ' - ';
    ob_end_flush();
    flush();
    sleep(1);
}

这是使用缓冲的一种更简洁的方式。由于您只使用 1 个缓冲区,因此它的性能也更高。如果您不需要在每个循环中使用flush,则可以跳过循环中的ob_flush,并使用ob_end_flush 而不是ob_end_clean

ob_implicit_flush(true);
ob_start();
for ($i=0; $i<5; $i++) {
    echo $i . ' - ';
    ob_flush();
    flush();
    sleep(1);
}
ob_end_clean();

【讨论】:

  • 谢谢!但是如果在每个循环中启动一个新缓冲区会对性能产生影响,那么只清理第一个并重新使用它会更好吗?以及怎么做?
  • 为什么要多次启动缓冲区?他只需要ob_flush()
  • @FrankerZ 在您撰写评论时我正在编辑答案:P
  • @JimWright 这个方法不起作用,因为它一次回显所有内容,而不是在每个循环之后
  • @medk 看看here。输出缓冲在浏览器中可能有点挑剔。
【解决方案2】:

ob_end_flush() 将禁用缓冲,因此将来在循环中对此的调用将失败。只需使用ob_flush(),它会清除缓冲区但保持输出缓冲:

ob_implicit_flush(true);
ob_start();
for ($i=0; $i<5; $i++) {
    echo $i . ' - ';
    ob_flush();
    sleep(1);
}
ob_end_flush();

【讨论】:

  • 循环结束后不需要刷新。
  • 如果他之后有额外的代码,或者他要回应的任何其他内容(例如最后的结束声明。)包括在内很重要。
【解决方案3】:

好的,我是这样解决的:

ob_implicit_flush(true);
ob_start();
for ($i=0; $i<5; $i++) {
    echo $i . ' - ';
    flush();
    @ob_flush();
    @ob_end_clean();
    sleep(1);
}

现在可以了。

【讨论】:

    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多