【问题标题】:how does the php output buffer work (problem using $_SERVER['REQUEST_TIME'] to calculate script execution time)php 输出缓冲区如何工作(使用 $_SERVER['REQUEST_TIME'] 计算脚本执行时间的问题)
【发布时间】:2011-07-07 19:24:08
【问题描述】:

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

我们在计算最终脚本(基于 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 将始终尽可能快地运行,并且不会等待客户端收到响应。
  • 为什么使用 $_SERVER。在脚本开头使用 $time= time() 调用更能反映执行时间的真正开始。而不是请求时间,因为请求时间不一定是脚本开始执行的时间。
  • 不知道 $_SERVER['REQUEST_TIME'] 变量是由 apache 设置的:/ 突然之间这很有意义;)总是假设 REQUEST_TIME 已填充那一刻apache将请求交给了php。

标签: php performance buffer output-buffering


【解决方案1】:

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

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

【讨论】:

  • X 介于 5-15 秒之间......该网站相当繁忙。所以你提到的问题很有可能。我们会将开始时间记录在一个单独的变量中,而不是依靠 $_SERVER['REQUEST_TIME'] 来获得更好的主意。
  • 谢谢你顺便说一句。这一直困扰着我大约......哦...... 1.5年;)
【解决方案2】:

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

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

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

仍然需要客户端下载页面。

当你有 2KB/s 的客户端时,除了升级他们的连接之外,别以为你可以做很多事情:P

【讨论】:

  • 2kb/s 只是一个例子,让这个问题相当容易理解。所以你的意思是,无论客户端连接有多快(或多慢),脚本末尾的 time()-$SERVER['REQUEST_TIME'] 都会给出真正的脚本执行时间?谢谢。
  • @anon1:是的,我就是这么说的。网络服务器获取请求,它只是处理请求(无需等待客户端)并在准备好时输出给客户端
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2017-04-06
  • 2013-06-06
  • 2011-07-24
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多