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

时间:2011-07-07 19:24:08

标签: php performance buffer output-buffering

我真的不知道怎么写标题所以我尽我所能。

我们有一个问题,我们计算最终脚本(基于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()吗?

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

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

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

如果您的客户端只有2KB / s而不是升级他们的连接,那么不要认为你可以做很多事情:P