输出缓冲不按预期工作?

时间:2014-07-24 05:47:34

标签: php output-buffering

我有一个长时间运行的脚本,并希望使用输出缓冲定期向浏览器发送输出。

我感到很困惑,因为我已经在这里读了很多问题,据说要用这个:

while (...) {
    ob_start();
    // echo statements
    ob_end_flush();
}

但这对我没有用。我也试过这个:

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}

但那也没有用。似乎唯一有效的是:

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}

为什么我必须先调用ob_end_clean()才能使输出缓冲起作用?

2 个答案:

答案 0 :(得分:2)

你做错了。这样就可以了:

while (...) {
    // echo statements
    flush();
}

确保您的Web服务器配置为在没有自己的缓存的情况下委派输出。如果您希望稍后以字符串形式获取输出,则仅需要输出缓冲区ob_start

另请查看ob_implicit_flush,它会在输出时自动执行刷新。

答案 1 :(得分:2)

可能这取决于你的其余代码。

对我来说,以下代码没有问题:

<?php
header( 'Content-type: text/html; charset=utf-8' );
$x = 1;

while ($x < 10) {
    echo $x."<br />";
    ob_flush();
    flush();
    sleep(1);
    ++$x;
}

您可以使用ob_implicit_flush(),但每次运行flash()时都不需要运行ob_flush(),因此以上代码可以更改为:

<?php
header( 'Content-type: text/html; charset=utf-8' );
$x = 1;

ob_implicit_flush(true);

while ($x < 10) {
    echo $x."<br />";
    ob_flush();    
    sleep(1);
    ++$x;
}

您还应该查看header()。如果在上述任何代码中我删除/注释行标题,则脚本结束执行后将显示所有内容。输出缓冲无法按预期工作