我们有一个ubuntu测试服务器,这个简单的脚本可以正常工作,每秒向浏览器输出一个数字
<?
for ($i=0; $i<3; $i++)
{
echo $i.'<br>';
flush();
sleep(1);
}
然而,在我的本地开发盒(Windows环境)中,我无法使其工作,它在3秒后输出。
我在本地盒子上使用相同的php版本(5.3.13)以及apache(2.2.22)版本作为测试服务器。 我已经镜像了php.ini和httpd.conf中的大多数设置 以下是我设置的设置(与测试服务器完全相同)
output_buffering 0
zlib.output_compression = Off
zlib.output_compression_level = -1
我没有安装mod_gzip。
我甚至尝试在我的盒子上进行wamp安装,但它也没有用。
我无法想象它是一个客户端(浏览器 - firefox 13)问题,因为我使用完全相同的浏览器来查看测试服务器上的脚本并且它工作正常
我尝试过启用隐式刷新,执行ob_flush等等。没有运气。
任何人对如何使其发挥作用有任何想法?
答案 0 :(得分:2)
请记住@Wrikken所说的,不建议这样做。
所以我在想,你所做的一切似乎都是正确的。我复制了你的设置并试过了。我遇到了同样的问题。我从命令行执行了脚本,它运行了。
然后我不得不做最后一次测试,Wireshark。在前几个数据包之后,显然服务器正在正确发送所有内容,因此它必须是浏览器的缓冲区。
所以我尝试在循环之前发送一些数据,那么猜猜是什么?它奏效了!
你走了:
<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
echo str_repeat(" ", 1024), "\n";
for($i=0;$i<6;$i++) {
echo $i."<br />\n";
ob_flush();
flush();
sleep(1);
}
?>
我不确定您的应用程序,但这显然不是一个好主意,我强烈建议您研究其他选项。
<强>更新强> 经过漫长的Google搜索,我找到了this和this
因为浏览器无法在不知道的情况下正确呈现页面 构建页面的字符,大多数浏览器缓冲一定的 执行任何JavaScript或绘制页面之前的字节数
和
为避免这些延迟,您应始终指定角色 对于任何大于1 KB的HTML文档,尽早编码 ( 1024字节,确切地说,这是使用的最大缓冲区限制 我们测试过的任何浏览器。)
所以我尝试先发送字符集而不是填充缓冲区:(并且它有效)
<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
//echo str_repeat(" ", 1024), "\n";
header('Content-Type: text/html; charset=iso-8859-1');
//Note that it shoudn't matter which charset you send
for($i=0;$i<6;$i++) {
echo $i."<br />\n";
ob_flush();
flush();
sleep(1);
}
?>
那么为什么它与第一台服务器合作而不是第二台呢?
很可能是因为你的第一台服务器正在发送带有标头的字符集,而第二台服务器则不是。
但是,在您的情况下,我会进行以下更改
<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
//Plain text MIME type since you'll use for logging purposes
//and if you run it from CLI, you can ignore the whole header line
header('Content-Type: text/plain; charset=iso-8859-1');
for($i=0;$i<6;$i++) {
//No need to echo <br /> once you'll run it from CLI
echo $i."\n";
ob_flush();
flush();
sleep(1);
}
?>
答案 1 :(得分:1)
我找到了解决问题的方法。 添加行
的某些原因default_charset = "utf-8"
到我的php.ini让它工作。 我确认我删除了线..冲洗没有工作。 添加它,它工作。也许是因为它为浏览器缓冲区添加了额外的标题。