调用ob_flush()和flush(),但在脚本完成之前,浏览器不会显示任何输出

时间:2011-04-24 13:59:20

标签: php output-buffering

您好 请查看以下代码:

<?php
ob_start();

echo "Start ...<br />\n";
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo "$i<br />\n";
    ob_flush(); 
    flush();
    sleep(1);
}
echo "End ...<br />\n";
?>

这是不正确的?我测试了它,但我的输出显示脚本完成时,有任何解决方案吗?

12 个答案:

答案 0 :(得分:15)

嘿,我也遇到了这个问题 最后得到了正确的解决方案 这是给你的

您必须为您的网页添加内容类型 你可以通过两种方式做到这一点  1.使用html标签

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

实施例

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wp Migration</title>
</head>
<body>
<?php 
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
</body>
</html>
  1. 使用php标头功能

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

  2. 实施例

    <?php 
    header( 'Content-type: text/html; charset=utf-8' );
    for($i=0;$i<70;$i++)
    {
    echo 'printing...<br>';
    ob_flush();
    flush();
    sleep(3);
    }
    ?>
    

    一切顺利

答案 1 :(得分:5)

某些浏览器在开始渲染之前需要至少接收256个字符。您是否已尝试填充更多输出,如:

echo str_repeat('&nbsp;', 50) . "$i<br />\n";

编辑

Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9下,我能够通过设置

重现OP的问题
zlib.output_compression = On

再次关闭它
zlib.output_compression = Off

让脚本按原样运行。

答案 2 :(得分:3)

尝试在第一行删除对ob_start()的调用:您无需启用输出缓冲 - 这可能会导致问题,此处。


我已经测试了你的代码:

  • 如果在第一行调用ob_start(),我只会在脚本完成后看到输出,10秒后
  • 如果我删除了对ob_start()的调用,那么,只要它在标准输出上显示,我就会每秒看到一行输出。

答案 3 :(得分:2)

使用Chrome,我发现需要更多的字节来绕过浏览器的缓冲区。在我的情况下,4096字节很好:

echo str_repeat(' ', 4096);

此外,在开头添加一些HTML元素似乎也是强制性的:

echo $content . '<br />';

答案 4 :(得分:1)

在我的系统上,似乎FF4需要超过256个字节才能开始渲染从服务器端到达的内容,然后我在开头解决了这个问题:

while (@ob_end_flush());
echo(str_repeat(' ',1024));
// ...etc...

答案 5 :(得分:1)

我发现这是因为Apache的gzip压缩正在用于我的案例。

关闭gzip以进行“刷新”#39;仅在脚本中,我在连续输出脚本所在的目录中创建了一个新的.htaccess文件,其中包含以下内容:

<IfModule mod_env.c>
    SetEnv no-gzip 1
</IfModule>

法拉盛再次按预期工作。

答案 6 :(得分:1)

对于使用FCGI / fast cgi的人。

FcgidOutputBufferSize 0

答案 7 :(得分:0)

这是对的。从运行PHP 5.3.3的CLI可以正常工作。如果它不适合您,您的PHP安装可能会禁用输出缓冲。

我还建议将ob_end_flush()放在脚本末尾以关闭输出缓冲区。

答案 8 :(得分:0)

IE8和flush()的一个偷偷摸摸的问题;如果你正在“刷新”表中的行。 IE只会在完成后显示表格。这是我的问题,将容器从表行更改为div可以解决问题。

答案 9 :(得分:0)

您需要添加.htaccess文件以禁用gzip输出

<IfModule mod_env.c>
    SetEnv no-gzip 1
</IfModule>

答案 10 :(得分:0)

我正在使用laravel框架并且缓冲不起作用但是。这是解决方案:

header( 'Content-type: text/html; charset=utf-8' );
ob_start();

ob_end_flush();
ob_flush();
flush();
for($i = 1;$i<= 5;$i++){
    echo $i;
    ob_flush();
    flush();

    sleep(3);
}

你必须先使用ob_end_flush();

答案 11 :(得分:0)

此流程也适用于Laravel

ob_implicit_flush(true);
echo "Processing ... "; // Or give out JSON output
ob_flush();
sleep(5); //A time-consuming synchronous process (SMTP mail, maybe?)
echo "Done";