2

我真的不知道如何表达标题,所以我尽我所能。

我们有一个问题,我们计算最终脚本(基于 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 查询#1”需要 5 秒?

我想你应该已经明白了。缓慢的客户端连接是否会影响处理脚本所需的时间。

更进一步:是否有任何 php.ini 设置会影响这一点,flush()/ob_flush() 是否有影响?

谢谢。

4

2 回答 2

3

PHP 将以最大可能的速度执行,如果必须缓冲输出,脚本将不会暂停,直到缓冲区清空。它只会不断填满缓冲区,直到脚本结束。

你的“X”值有多大?$_SERVER['REQUEST_TIME'] 来自 Apache 本身,并且是命中的时间。Apache 中可能会暂停以等待子进程可以为请求提供服务。在等待资源打开时,PHP 中可能会出现暂停(例如,没有更多可用的数据库句柄,因此请等待一个释放)。然后数据库本身可能会延迟执行和从磁盘检索数据等......

于 2011-07-07T19:31:13.967 回答
0

PHP 是服务器端的,因此脚本执行时间不依赖于客户端连接。

PHP 通常在脚本完成后输出。

Flush 可用于长时间运行的脚本在此脚本尚未完成时输出。

客户端仍然必须下载该页面。

不要认为当您的客户端速度为 2KB/s 时,除了升级他们的连接之外,您可以做很多事情:P

于 2011-07-07T19:30:48.133 回答