我真的不知道怎么写标题所以我尽我所能。
我们有一个问题,我们计算最终脚本(基于Web)的执行时间。
我们做一个简单的
if(time()-$_SERVER['REQUEST_TIME']>X){
logMe();
}
我们发现有时候脚本显示的时间要长X秒才能执行。
我们100%确定这不是mysql,memcached,sphinx或任何其他常见罪魁祸首的问题。拜托......只是假设它不是'我们最终的东西'来阻止它。
我们甚至在脚本中添加了这个简单的exec时间检查方式,然后进行任何繁重的处理并且仍有一些命中。主要是远在海外的客户。
所以我认为这必须以某种方式与输出缓冲区相关。
所以问题如下:
在php + apache中,输出缓冲区如何工作?假设您有以下内容:
[ 10KB HTML Body Head ]
[ Mysql query #1 ]
[ 50KB HTML Body ]
[ Mysql query #2 ]
[ 20KB HTML Body Footer ]
在这个例子中,假设您的客户端连接最大速度为2KB / s。
所以在最理想的情况下,他需要5秒才能收到“HTML Body Head”。
是否意味着在执行“Mysql query#1”之前需要5秒钟?
我想你明白了。缓慢的客户端连接会影响脚本处理所需的时间。
更多:做任何php.ini设置都会影响这个,并刷新()/ ob_flush()吗?
感谢。
答案 0 :(得分:3)
PHP将以最大可能的速度执行,如果必须缓冲输出,脚本将暂停,直到缓冲区清空。它将继续填充缓冲区,直到脚本结束。
你的'X'值有多大? $ _SERVER ['REQUEST_TIME']来自Apache本身,并且当它被命中时.Apache可能会暂停等待子进程可用于为请求提供服务。在等待资源打开时,PHP可能会暂停(例如,没有更多的免费数据库句柄,所以等待一个人释放)。然后,数据库本身可能会延迟执行和从磁盘上检索数据等......
答案 1 :(得分:0)
PHP是服务器端,因此脚本执行时间不依赖于客户端连接。
PHP通常会在脚本完成后输出。
当此脚本尚未完成时,Flush可用于输出长时间运行的脚本。
仍然是客户端必须下载页面。
如果您的客户端只有2KB / s而不是升级他们的连接,那么不要认为你可以做很多事情:P