【问题标题】:Output buffering not working as expected?输出缓冲没有按预期工作?
【发布时间】:2014-07-24 05:47:33
【问题描述】:

我有一个长时间运行的脚本,想使用输出缓冲定期将输出发送到浏览器。

我很困惑,因为我在这里阅读了许多说要使用这个的问题:

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() 才能使输出缓冲起作用?

【问题讨论】:

    标签: php output-buffering


    【解决方案1】:

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

    对我来说,以下代码可以正常工作:

    <?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()。如果在上述任何代码中我删除/注释带有标题的行,所有内容都将在脚本结束执行后显示。输出缓冲无法按预期工作

    【讨论】:

    • 我没有 header() 语句,我认为这是问题所在。谢谢!
    【解决方案2】:

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

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

    确保您的网络服务器已配置为委派输出而无需自己的缓存。仅当您想稍后将输出作为字符串获取时,才需要输出缓冲区ob_start

    还可以查看ob_implicit_flush,它会自动对输出执行刷新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 2013-01-01
      相关资源
      最近更新 更多