php输出缓冲区是如何工作的(使用$_SERVER['REQUEST_TIME']计算脚本执行时间的问题


how does the php output buffer work (problem using $_SERVER['REQUEST_TIME'] to calculate script execution time)

我真的不知道怎么写标题,所以我尽力了。

我们在计算最终脚本(基于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