您好 请查看以下代码:
<?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";
?>
这是不正确的?我测试了它,但我的输出显示脚本完成时,有任何解决方案吗?
答案 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>
使用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);
}
?>
一切顺利
答案 1 :(得分:5)
某些浏览器在开始渲染之前需要至少接收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
下,我能够通过设置
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";