我真的不知道怎么写标题,所以我尽力了。
我们在计算最终脚本(基于web的)执行时间时遇到了一个问题。
我们做一个简单的
if(time()-$_SERVER['REQUEST_TIME']>X){
logMe();
}
我们发现有时脚本的执行时间超过X秒。
我们100%确定这不是mysql, memcached, sphinx或任何其他常见的罪魁祸首的问题。请……只要假定它不是"我们这边的什么东西"在支撑它。
我们甚至在脚本中添加了这个简单的执行时间检查,在任何繁重的处理完成之前,仍然有一些命中。主要是遥远的海外客户。
所以我认为这一定与输出缓冲区有关。
所以问题如下:
在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设置影响这个,是否flush()/ob_flush()?
谢谢。
PHP将以最大可能的速度执行,如果输出必须被缓冲,脚本将不会暂停,直到缓冲区清空。它会一直填满缓冲区,直到脚本结束。
你的"X"值有多大?$_SERVER['REQUEST_TIME']来自Apache本身,是点击进入的时间。Apache中可能会暂停,等待子进程可用来为请求提供服务。在等待资源打开时,PHP可能会暂停(例如,没有更多空闲的数据库句柄,因此等待一个释放)。然后,数据库本身在执行和从磁盘检索数据时可能会出现延迟,等等。
PHP是服务器端,所以脚本的执行时间不依赖于客户端连接。
PHP通常在脚本完成后输出。
Flush可用于长时间运行的脚本在脚本尚未完成时输出。
客户端仍然需要下载页面
当你的客户端有2KB/s的速度时,除了升级他们的连接,你别以为还有很多事情可以做:p