为什么flush()不能在for循环中工作?(PHP)


Why flush() not working in for loop? (PHP)

我想在for loop中使用flush()函数,在每个循环后返回内容
我的代码是:

<?php
if (ob_get_level() == 0) ob_start();
for ($i = 0; $i<10; $i++){
        echo "<br> Line".$i." to show.";
        ob_flush();
        flush();
        sleep(2);
}
echo "<br>Done.";
ob_end_flush();
?>

这段代码可以在本地主机和另一台主机(Demo)上工作,但不能在我的主主机(Demo + phpinfo页)

我该如何解决这个问题?我用chrome

在第二台服务器前面有一个" varnish "代理。它扰乱了你的剧本时间。通常,在返回响应时不应该依赖于计时,因为可能会有代理服务器挡在中间。您可能需要使用某种轮询或WebSockets来代替。

$ nc shoma.info 80
GET /test/1.php HTTP/1.1
Host: shoma.info
Connection: close
HTTP/1.1 200 OK
Server: Apache
X-Powered-By: PHP/5.3.28
Vary: Accept-Encoding
Content-Type: text/html
Content-Length: 209
Accept-Ranges: bytes
Date: Sat, 22 Mar 2014 19:18:40 GMT
X-Varnish: 972965439
Age: 0
Via: 1.1 varnish <------- this is the problem
Connection: close
<br> Line 0 to show.<br> Line 1 to show.<br> Line 2 to show.<br> Line 3 to show.<br> Line 4 to show.<br> Line 5 to show.<br> Line 6 to show.<br> Line 7 to show.<br> Line 8 to show.<br> Line 9 to show.<br>Done.

顺便说一句:我这里的firefox甚至没有显示您的第一个服务器的"动画"。所以你甚至不能依赖浏览器来显示它

你的PHP配置有问题。

output_buffering -是PHP配置文件PHP .ini中的一个参数。它启用数据的输出缓冲。

在你的PHP配置中有'no value'。因此,只需设置output_buffering参数'On'。或者如果你想在这个指令中为缓冲数据集的字节数设置一些限制(例如'4096')。

试着在开头设置:

ini_set('implicit_flush', true);
源这里