为什么PHP flush不能始终正常工作,第1/5次没有正确加载?

时间:2012-05-08 17:02:16

标签: php apache

一个大的php脚本使用flush将生成的html的一部分发送到浏览器,同时执行脚本的大部分需要appr。 20秒

刷新后正在执行的脚本部分相当大,从服务器预留(90%cpu)中占用很多。

一旦进入5次页面保持空白(白色),这意味着刷新没有到达发送显示页面正在加载的图像。当程序完成时,页面保持空白(浏览器指示它仍在加载),并且应该将整个页面发送到浏览器。

显着的: 当我按下后退按钮时,整个页面将显示(应该在执行整个脚本后在浏览器中加载)一秒钟,然后浏览器返回上一页。

所有其他4次页面加载良好。所有5次PHP脚本的输入都是相同的。

我在.htacces文件中有这些设置:

addhandler x-httpd-php5-cgi .php5 
addhandler x-httpd-php5-cgi .php5
addhandler x-httpd-php5-cgi .php5 
Header Set Cache-Control "max-age=0, no-store"

这是将生成的代码刷新到浏览器的语句:

print str_pad('',4096)."\n";
ob_flush();
flush();

可能导致此问题的原因是什么?

2 个答案:

答案 0 :(得分:2)

你只能提示:flush()将它发送到apache / webserver,它可以缓冲/等待,它将任意数量的代理发送到网络,这些代理可以缓冲/等待,最终会在你的浏览器,也可以决定缓冲/等待。如果你不想处理那些令人头疼的问题,那就选择异步方法。 Gearman让它变得非常简单,但当然不是绝对必要的。

答案 1 :(得分:2)

print str_pad('',4096)."\n";
你注意到你重复一个空字符串吗?也许你的意思是

print str_pad(' ',4096)."\n";

该声明的目的是因为某些Web浏览器在收到一定数量的字节或响应完成之前不会呈现页面,以先到者为准。