如何衡量加载页面所需的时间(使用各种不同的PHP语句)?
有点像这里的统计数据 - http://talks.php.net/show/drupal08/24
答案 0 :(得分:43)
有很多方法可以做到这一点。我个人喜欢以下列方式使用microtime:
// Start of code
$time = microtime(true); // Gets microseconds
// Rest of code
// End of code
echo "Time Elapsed: ".(microtime(true) - $time)."s";
这将为您提供微秒精度。
如果您正在编写命令行脚本(如Facebook谜题),您可以只使用时间。
time php dancebattle.php ~/input.dat
Win
real 0m0.152s
user 0m0.142s
sys 0m0.012s
我忘记了监控页面加载时间的方法(来自浏览器)。您可以使用Firebug(适用于Firefox)的NET选项卡来执行此操作。它可以让你观察各种文件加载(AJAX,JS,CSS,图像等)。
答案 1 :(得分:11)
最简单的是Apache Bench (称为ab
),它随Apache一起提供:
似乎适合幻灯片上显示的那种非常简单的报告。
(实际报告的内容不止于此)
如果您的需求更复杂,Siege可能是一个不错的选择。
Siege的一个有趣的事情是,它可以从文件中获取一个URL列表,而不是只使用一个。
这些工具的一个有趣之处在于,您不仅仅测量执行特定部分代码所花费的时间(就像在PHP代码中直接使用microtime
那样),但是'获得服务页面所需的整个时间。
此外,它不仅可以对PHP代码进行基准测试,因为它正在处理HTTP请求,而不是代码本身。
答案 2 :(得分:9)
$ time curl http://www.example.com/
请注意,它会占用整个请求,包括网络延迟。但那可能是你想要的?
答案 3 :(得分: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
)
答案 4 :(得分:2)
您可以在处理开始时和输出结束时使用microtime(),然后根据需要计算差异并将其转换为秒。
这只会测量PHP端的执行时间,而不是整个页面加载时间似乎在你的链接中,但它可以比较各种方法的性能,例如。
答案 5 :(得分:2)
您说要测量“页面加载时间”完全不同于
生成页面所需的时间(由PHP代码中的内部计时器测量)
并从服务器卸载(由ab测量)
页面加载时间应该包括解析HTML并向服务器发送后续请求以获取所有相关内容(javascript文件,css文件,图像等)所花费的时间。
测量这个实际上非常困难。要正确地执行此操作,您需要推送所有逻辑客户端 - 在用户单击链接或提交表单时删除带时间戳的javascript cookie,然后在后续页面中使用onload方法(在所有内容加载后触发)将此时间与当前时间进行比较。然后,您需要一种将此度量标准报告回服务器的方法 - 您可以使用Ajax请求,或将时间存储在另一个cookie中,以便在后续请求中显示。
请注意,每个客户端所需的文件将取决于浏览器端缓存的当前状态。
如果您可以从日志中隔离点击流,那么您可以通过检查text / html内容类型请求与text / html之外的内容类型的最后连续请求之间的间隔来获得良好的近似值。但是,如果用户同时与多个浏览器窗口进行交互,您的统计数据将会出现偏差。
答案 6 :(得分:1)
方法二: 将这些陈述放在你的脚本周围
$TIMER['label']=microtime(1);
/* some code */
$TIMER['sql1_before']=microtime(1);
a/* 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>";
因此,您将获得有关代码如何运行的四线报告。
此操作称为profiling
,并在优化过程中占据最重要的位置。
答案 7 :(得分:0)
该演示文稿中的输出似乎是从Siege(http://www.joedog.org/index/siege-home)中复制的。
另一个非常有用的“真实世界”性能测试工具是Firebug(http://getfirebug.com/)和YSlow(http://developer.yahoo.com/yslow/)
答案 8 :(得分: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()
答案 9 :(得分: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代码部分。