php输出缓冲区是如何工作的(使用$#u SERVER[';REQUEST#u TIME';]计算脚本执行时间时出现问题)

php输出缓冲区是如何工作的(使用$#u SERVER[';REQUEST#u TIME';]计算脚本执行时间时出现问题),php,performance,buffer,output-buffering,Php,Performance,Buffer,Output Buffering,我真的不知道如何用词来形容这个标题,所以我尽了最大的努力 我们在计算最终脚本(基于web的)执行时间时遇到了一个问题 我们做一个简单的 if(time()-$_SERVER['REQUEST_TIME']>X){ logMe(); } 我们发现,有时脚本的执行时间比X秒长 我们100%确信这不是mysql、memcached、sphinx或任何其他常见的罪魁祸首的问题。请只要假设不是“我们这边有什么东西”在支撑它 我们甚至在脚本中添加了这个简单的exec时间检查,在任何繁重的处理

我真的不知道如何用词来形容这个标题,所以我尽了最大的努力

我们在计算最终脚本(基于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查询#1”需要5秒钟

我想你明白了。客户端连接速度慢是否会影响处理脚本所需的时间

此外:是否有任何php.ini设置会影响这一点,以及flush()/ob_flush()


谢谢。

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

PHP通常在脚本完成后输出

当长时间运行的脚本尚未完成时,可以使用Flush输出该脚本

客户端仍然需要下载页面


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

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


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

PHP将始终以尽可能快的速度运行,并且不会等待客户端接收响应。为什么要使用$\u服务器。在脚本开始时使用$time=time()调用更能反映执行时间的真正开始。而不是请求时间,因为请求时间不一定是脚本开始执行的时间。我不知道$\u SERVER['request\u time']变量是由apache设置的:/突然之间,这很有意义;)总是假设在apache将请求移交给php时,请求时间就已填充。2kb/s只是一个使问题相当容易理解的示例。因此,您的意思是,无论客户端连接有多快(或多慢),脚本末尾的time()-$SERVER['REQUEST_time']都会给出真正的脚本执行时间?thx。@anon1:是的,我就是这么说的。Web服务器获取请求,它只处理请求(无需等待客户端),并在准备好客户端的时间在5-15秒之间时输出。。。。。这个网站相当繁忙。所以你提到的这个问题是很有可能的。我们将在一个单独的var中记录开始时间,而不是依赖$\u服务器['REQUEST\u time']来获得更好的想法。顺便说一句,谢谢你。这已经困扰了我大约。。。哦1.5年;)