嗨,请查看以下代码:
<?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";
?>
不正确?我已经对其进行了测试,但是脚本完成后我的输出显示,有什么解决方案吗?
嗨,请查看以下代码:
<?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";
?>
不正确?我已经对其进行了测试,但是脚本完成后我的输出显示,有什么解决方案吗?
嘿,伙计,我也陷入了这个问题,终于在这里找到了正确的解决方案,适合您
你必须为你的页面添加内容类型 你可以通过两种方式做到这一点 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>
使用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);
}
?>
一切顺利
一些浏览器在开始渲染之前需要至少接收 256 个字符。您是否已经尝试过填充更多输出,例如:
echo str_repeat(' ', 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
使脚本按要求工作。
尝试删除对ob_start()
第一行的调用:您无需启用输出缓冲——这可能会导致麻烦,在这里。
我已经测试了你的代码:
ob_start()
在第一行调用,我只在脚本完成时看到输出,10 秒后ob_start()
,那么,只要它显示在标准输出上,我就会每秒看到一行输出。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 />';
在我的系统上,FF4 似乎需要超过 256 个字节才能开始渲染从服务器端到达的内容,然后我在一开始就解决了这个问题:
while (@ob_end_flush());
echo(str_repeat(' ',1024));
// ...etc...
我发现这是由于我的案例正在使用 Apache 的 gzip 压缩。
为了仅为“刷新”脚本关闭 gzip,我在.htaccess
连续输出脚本所在的目录中创建了一个新文件,其中包含以下内容:
<IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule>
冲洗再次按预期工作。
对于使用 FCGI / 快速 cgi 的人。
FcgidOutputBufferSize 0
它是正确的。从运行 PHP 5.3.3 的 CLI 对我来说效果很好。如果它不适合您,您的 PHP 安装可能禁用了输出缓冲。
我还建议将ob_end_flush()放在脚本末尾以关闭输出缓冲区。
IE8 和 flush() 的一个偷偷摸摸的问题;是如果你“刷新”表中的行。IE 只会在表格完成时显示表格。这是我的问题,将容器从表格行更改为 div 解决了这个问题。
此流程也适用于 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";
我正在使用 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();
您需要添加一个.htaccess
文件来禁用 gzip 输出
<IfModule mod_env.c>
SetEnv no-gzip 1
</IfModule>