5

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

刷新后正在执行的脚本部分非常大,并且从服务器储备中占用了大量资源(90% cpu)。

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

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

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

我的 .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();

什么可能导致这个问题?

4

2 回答 2

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

你注意到你在重复一个空字符串吗?也许你的意思是

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

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

于 2012-05-08T18:01:33.220 回答
2

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

于 2012-05-08T17:06:47.293 回答