请记住@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);
}
?>
我不确定您想到的应用程序,但这显然不是一个好主意,我强烈建议您考虑其他选项。
更新:
经过长时间的谷歌搜索,我发现了这个和这个
由于浏览器在不知道如何构造页面字符的情况下无法正确呈现页面,因此大多数浏览器在执行任何 JavaScript 或绘制页面之前会缓冲一定数量的字节
和
为了避免这些延迟,对于任何大于 1 KB(准确地说是1024 字节,这是我们测试过的任何浏览器使用的最大缓冲区限制)的任何 HTML 文档,您都应该尽早指定字符编码。
所以我尝试先发送字符集而不是填充缓冲区:(它有效)
<?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);
}
?>