基准测试 PHP 页面加载时间

18
10个回答

45

有很多方法可以实现这个功能。我个人喜欢使用microtime,以下是具体方法:

// Start of code
$time = microtime(true); // Gets microseconds

// Rest of code

// End of code
echo "Time Elapsed: ".(microtime(true) - $time)."s";

这将为您提供微秒级的精确度。

如果您正在编写命令行脚本(例如 Facebook puzzles),则可以使用 time 命令。

time php dancebattle.php ~/input.dat
Win

real    0m0.152s
user    0m0.142s
sys     0m0.012s

我忘记了如何监测页面加载时间(从浏览器)。您可以使用Firebug的NET选项卡(适用于Firefox)来做到这一点。它将允许您观察各种文件的加载情况(AJAX、JS、CSS、图像等)。


11
最简单的工具是Apache Bench(称为ab),它是由Apache提供的:
  • 它是一个命令行工具
  • 可以并行发送多个请求到一个URL
  • 并报告时间、错误等
看起来适合你幻灯片上展示的非常简单的报告类型。
(实际上它报告的内容更多)
如果您的需求稍微复杂一些,[Siege][2]可能是一个不错的选择。
Siege的一个有趣之处在于它可以从文件中获取URL列表,而不仅仅是处理一个URL。
使用这些工具的一个有趣之处在于,你不仅仅是测量执行代码特定部分所花费的时间(就像在你的PHP代码中直接使用[`microtime`][3]那样),而是获取了为提供页面所需的整个时间。
此外,它可以对不仅仅是PHP代码进行基准测试,因为它是在HTTP请求上工作,而不是在代码本身上。

9
  $ time curl http://www.example.com/

请注意,它计时整个请求,包括网络延迟。但这也许是你想要的?

4

请尝试访问 https://github.com/fotuzlab/appgati

它允许在代码中定义步骤,并报告两个步骤之间的时间、内存使用情况、服务器负载等信息。

类似于:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

    $report = $appgati->Report('1', '2');
    print_r($report);

示例输出数组:

Array
(
    [Clock time in seconds] => 1.9502429962158
    [Time taken in User Mode in seconds] => 0.632039
    [Time taken in System Mode in seconds] => 0.024001
    [Total time taken in Kernel in seconds] => 0.65604
    [Memory limit in MB] => 128
    [Memory usage in MB] => 18.237907409668
    [Peak memory usage in MB] => 19.579357147217
    [Average server load in last minute] => 0.47
    [Maximum resident shared size in KB] => 44900
    [Integral shared memory size] => 0
    [Integral unshared data size] => 0
    [Integral unshared stack size] => 
    [Number of page reclaims] => 12102
    [Number of page faults] => 6
    [Number of block input operations] => 192
    [Number of block output operations] => 
    [Number of messages sent] => 0
    [Number of messages received] => 0
    [Number of signals received] => 0
    [Number of voluntary context switches] => 606
    [Number of involuntary context switches] => 99
)

1
有趣但在Windows上无法运行 :-) 也许有些人(像我一样)有一个Windows系统.. :D - Bogdan
很遗憾,这个愚蠢的脚本只能在Unix上运行。请让Windows去别处试试手气吧 :) - fotuzlab

2
您可以在处理开始和输出结束时使用microtime(),然后计算差异并按需要将其转换为秒。
这只会测量PHP方面的执行时间,而不是整个页面加载时间,因为它似乎在您的链接中,但它可以让您比较各种方法的性能。

...但你需要将这些记录在某个地方才能使其有任何价值。 - symcbean
当然,这个问题是关于测量页面加载时间以比较代码性能的。在纯调试过程中,无需记录它,只需在页面页脚显示两个微秒之间的差异即可。对于全局性能测量,我建议使用外部工具,例如Apache Bench。 - Benoit

2
你说你想要衡量“页面加载时间”,这与以下两种情况完全不同
  1. 生成页面所需的时间(由PHP代码中的内部计时器测量)

  2. 将其从服务器卸载的时间(由ab测量)

页面加载时间应包括解析HTML以及请求服务器获取所有相关内容(JavaScript文件、CSS文件、图像等)所需的时间。
实际上,测量这个指标相当困难。要做到正确,您需要将所有逻辑推到客户端 - 当用户单击链接或提交表单时,放置一个带有时间戳的JavaScript cookie,然后在后续页面中,使用onload方法(在所有内容加载完成后触发)将此时间与当前时间进行比较。然后,您需要一种报告此指标的方法返回到服务器 - 您可以使用Ajax请求,或将时间存储在另一个cookie中,在后续请求中呈现。
请注意,每个客户端所需的文件取决于浏览器侧缓存的当前状态。
如果您可以从日志中分离点击流,则可以通过检查请求文本/ html内容类型和最后一个连续请求非text / html内容类型之间的时间间隔来获得良好的近似值。但是,如果用户同时使用多个浏览器窗口进行交互,则会导致您的统计数据失真。

1
方法一:使用 xdebug。 方法二: 在你的脚本周围放置这些语句: $TIMER['label']=microtime(1); /* some code */ $TIMER['sql1_before']=microtime(1); /* some code */ $TIMER['sql1_after']=microtime(1); /* some code */ 然后用像这样的代码输出它:
  echo "<table border=1><tr><td>name</td><td>so far</td><td>delta</td><td>per cent</td></tr>";
  reset($TIMER);
  $start=$prev=current($TIMER);
  $total=end($TIMER)-$start;
  foreach($TIMER as $name => $value) {
    $sofar=round($value-$start,3);
    $delta=round($value-$prev,3);
    $percent=round($delta/$total*100);
    echo "<tr><td>$name</td><td>$sofar</td><td>$delta</td><td>$percent</td></tr>";
    $prev=$value;
  }
    echo "</table>";

因此,您将获得有关代码运行情况的详细报告。这个操作被称为分析,在优化过程中占据了最重要的位置。

0
将以下代码放在您的PHP页面顶部。
<?php
$statrttime = microtime();
$time = explode(' ', $statrttime);
$time = $time[1] + $time[0];
$start = $time;
?>

以下代码必须放在您的页面末尾。

<?php
$endtime = microtime();
$time = explode(' ', $endtime);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page load in '.$total_time.' seconds.';
?>

注意:如果你要测量代码的某个特定部分的时间,请将其放在 PHP 代码的起始和最后部分。

0
使用microtime() PHP函数,您可以精确地知道执行您的PHP代码需要多少时间。按照以下步骤将PHP代码放在您的网页上:
将以下代码放置在您的PHP页面顶部(如果您要测量代码的特定部分所需的时间,请将其放在该PHP代码部分之前)。
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>

以下代码必须放在网页的最后(或PHP代码部分的结尾)。
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$finish = $time;
$total_time = round(($finish - $start), 4);
echo 'Page generated in '.$total_time.' seconds.';

如果不起作用,请使用microtime(true)而不是microtime()


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接