20

嗨,请查看以下代码:

<?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";
?>

不正确?我已经对其进行了测试,但是脚本完成后我的输出显示,有什么解决方案吗?

4

12 回答 12

14

嘿,伙计,我也陷入了这个问题,终于在这里找到了正确的解决方案,适合您

你必须为你的页面添加内容类型 你可以通过两种方式做到这一点 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' ); ?>

前任。

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

一切顺利

于 2013-06-12T13:15:54.447 回答
6

一些浏览器在开始渲染之前需要至少接收 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

使脚本按要求工作。

于 2011-04-24T14:48:29.997 回答
4

尝试删除对ob_start()第一行的调用:您无需启用输出缓冲——这可能会导致麻烦,在这里。


我已经测试了你的代码:

  • 如果ob_start()在第一行调用,我只在脚本完成时看到输出,10 秒后
  • 如果我删除对 的调用ob_start(),那么,只要它显示在标准输出上,我就会每秒看到一行输出。
于 2011-04-24T14:04:16.857 回答
2

Using Chrome, I found out that many more bytes are required to by-pass the browser's buffer. In my case 4096 bytes was fine:

echo str_repeat(' ', 4096);

Also, adding some HTML element at the beginning also seemed to be mandatory:

echo $content . '<br />';
于 2012-05-24T18:14:07.360 回答
1

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

while (@ob_end_flush());
echo(str_repeat(' ',1024));
// ...etc...
于 2011-06-16T14:52:22.410 回答
1

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

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

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

冲洗再次按预期工作。

于 2015-02-05T13:10:56.190 回答
1

对于使用 FCGI / 快速 cgi 的人。

FcgidOutputBufferSize 0
于 2015-02-13T07:22:01.707 回答
0

它是正确的。从运行 PHP 5.3.3 的 CLI 对我来说效果很好。如果它不适合您,您的 PHP 安装可能禁用了输出缓冲。

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

于 2011-04-24T14:08:40.193 回答
0

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

于 2013-08-07T08:48:57.103 回答
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";
于 2017-03-22T06:41:13.177 回答
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();

于 2016-08-20T19:07:56.723 回答
0

您需要添加一个.htaccess文件来禁用 gzip 输出

<IfModule mod_env.c>
    SetEnv no-gzip 1
</IfModule>
于 2015-11-28T02:17:05.797 回答