测量提供Web内容的PHP脚本的执行时间

时间:2014-09-01 15:20:02

标签: php nginx execution-time

我正在测试一些PHP脚本的执行时间,这些脚本的目的是在我的网站上提供Web内容。

但是我的结果不一致。

测量执行时间并记录到文本文件中。

其中一个脚本基本上是从磁盘读取jpeg图像并将其提供给客户端。

以下是带有相关代码的脚本的简化版本:

<?php

// save initial time 
$t1 = microtime(true);

// set header for a jpeg image
header('Content-Type: image/jpeg');

// read a file from the hard drive and send content
// (the real code serves every time a different image based on the request)
readfile( 'the_image.jpg' );

// flush output buffer
flush();
ob_flush();

// save final time
$t2 = microtime(true);

// elapsed time in milliseconds
$te = round( ( $t2 - $t1 ) * 1000 );

// write a line to the log file
$handle = fopen( 'log.txt', 'a' );
fwrite( $handle, $te . "\n" );
fclose( $handle );

所提供的图像每次都不同。它们的大小约为100KB。

我从远程位置连接到网站并加载一些图片。

当我查看日志文件时,以毫秒为单位的执行时间如下所示

45
63
40
3
3
67
40
3
5

我希望(但可能我错了)当PHP脚本向客户端发送数据时执行会等到数据发送完毕。

因此,在上面的代码中,当图像完全发送到客户端时,将检索$t2

那么为什么有时候图像只需3毫秒就可以发送? 考虑到我连接到服务器时使用的互联网连接,无法实现3毫秒。

PHP是否会立即将所有数据发送到Web服务器(在我的情况下是 nginx )然后后者花时间将数据发送到客户端?


更新

似乎问题与 nginx 做缓冲有关。

当发生这种情况时 nginx &#34;吃掉&#34;尽可能快地从PHP输出缓冲区,然后将内容发送到客户端。

这样可以更快地关闭PHP实例。

PHP脚本没有看到将内容传输到客户端所需的时间。

不幸的是,似乎没有办法禁用 nginx 缓冲。我发现了许多&#34;食谱&#34;谷歌搜索,但没有人工作。

3 个答案:

答案 0 :(得分:1)

  1. 我的其他答案
  2. 有更多缓存系统。您的硬盘驱动器,您的操作系统和PHP都有一个缓存系统,可以帮助您优化加载文件。 您只能看到PHP加载文件需要多长时间。
  3. 如果您想了解客户需要加载多长时间,那么您必须使用JS。

    不要忘记,您的浏览器也有一个缓存系统。您可以使用标题或不同的网址

    禁用它

答案 1 :(得分:0)

您可以尝试从命令行运行脚本,以查看连接延迟是否是一个因素。我怀疑不是 - 它可能与服务器上的负载有关。如果在请求时磁盘或CPU被占用,则会影响脚本的执行时间。

答案 2 :(得分:0)

简短而简单:flush();不等待客户。

只有PHP需要的时间而不是网络。