我想在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);
源这里