对 PHP 页面加载时间进行基准测试
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2454161/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Benchmarking PHP page load times
提问by Anant
How could I measure the time taken to load a page (with various different PHP statements)?
我如何测量加载页面所需的时间(使用各种不同的 PHP 语句)?
Somewhat like the stats available here - http://talks.php.net/show/drupal08/24
有点像这里提供的统计数据 - http://talks.php.net/show/drupal08/24
采纳答案by Pascal MARTIN
The most simple too is Apache Bench(called ab), which is provided with Apache :
最简单的也是Apache Bench (称为ab),它是随 Apache 提供的:
- It's a command-line tool
- That can send many requests, in parallel, to and URL
- And reports timings, errors, ...
- 这是一个命令行工具
- 可以并行发送许多请求到和 URL
- 并报告时间、错误、...
Seems to fit the kind of very simple reporting that's presented on your slide.
(It does actually report more than that)
似乎适合幻灯片上显示的那种非常简单的报告。
(它实际上报告的不止这些)
If your needs ar ea bit more complex, Siegecan be a good alternative.
如果您的需求更复杂一些,Siege可能是一个不错的选择。
An interesting thing with Siege is that it can take a list of URLs from a file, instead of working with just one.
Siege 一个有趣的事情是它可以从文件中获取 URL 列表,而不是只使用一个。
An interesting thing with those tools is that you are not measuring only the time taken to execute a specific portion of code (like you would if using microtimedirectly in your PHP code), but you're getting the whole time that was required to serve the page.
使用这些工具的一个有趣的事情是,您不仅仅测量执行特定代码部分所花费的时间(就像microtime直接在 PHP 代码中使用一样),而是获得了为服务提供服务所需的全部时间页。
Also, it can benchmark more than just PHP code, as it's working on the HTTP request, and not the code itself.
此外,它不仅可以对 PHP 代码进行基准测试,因为它正在处理 HTTP 请求,而不是代码本身。
回答by St. John Johnson
There are many ways to do this. I've personally been a fan of using microtimein the following way:
有很多方法可以做到这一点。我个人一直在使用的风扇microtime中以下列方式:
// Start of code
$time = microtime(true); // Gets microseconds
// Rest of code
// End of code
echo "Time Elapsed: ".(microtime(true) - $time)."s";
That will give you microsecond accuracy.
这将为您提供微秒精度。
If you are writing command-line scripts (like Facebook puzzles), you can use just time.
如果您正在编写命令行脚本(如 Facebook 拼图),您可以只使用时间。
time php dancebattle.php ~/input.dat
Win
real 0m0.152s
user 0m0.142s
sys 0m0.012s
I forgot about the method of monitoring page load times (from a browser). You can use the NET tab from Firebug (for Firefox) to do just that. It will let you watch the various file loads (AJAX, JS, CSS, Images, etc.).
我忘记了监控页面加载时间的方法(从浏览器)。您可以使用 Firebug(用于 Firefox)中的 NET 选项卡来做到这一点。它将让您观察各种文件加载(AJAX、JS、CSS、图像等)。
回答by Martin Wickman
$ time curl http://www.example.com/
Note that it times the whole request, including network latency. But that may be want you want?
请注意,它对整个请求进行计时,包括网络延迟。但这可能是你想要的吗?
回答by fotuzlab
Try https://github.com/fotuzlab/appgati
试试https://github.com/fotuzlab/appgati
It allows to define steps in the code and reports time, memory usage, server load etc between two steps.
它允许在代码中定义步骤并报告两个步骤之间的时间、内存使用情况、服务器负载等。
Something like:
就像是:
$appgati->Step('1');
// Do some code ...
$appgati->Step('2');
$report = $appgati->Report('1', '2');
print_r($report);
Sample output array:
示例输出数组:
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
)
回答by symcbean
You say you want to measure "Page load times" which is completely different from
你说你想测量“页面加载时间”,这与
the time it takes to generate the page (as measured by an internal timer in your PHP code)
and offload it from the server (which is measured by ab)
生成页面所需的时间(由 PHP 代码中的内部计时器测量)
并从服务器卸载(以ab衡量)
A page load time should include the time taken to parse the HTML and to make subsequent requests to the server to fetch all related content (javascript files, css files, images etc).
页面加载时间应包括解析 HTML 以及向服务器发出后续请求以获取所有相关内容(javascript 文件、css 文件、图像等)所花费的时间。
Measuring this is actually quite difficult. To do it properly, you need to push all the logic client side - drop a timestamped javascript cookie when the user clicks on a link or submits a form, then in the subsequent page, using the onload method (which fires after everything has loaded) compared this time with the current time. You then need a method of reporting this metric back to the server - you can use an Ajax request, or store the time in another cookie to be presented in the subsequent request.
衡量这一点实际上非常困难。要正确执行此操作,您需要推送所有逻辑客户端 - 当用户单击链接或提交表单时删除带时间戳的 javascript cookie,然后在后续页面中使用 onload 方法(在所有内容加载后触发)将这个时间与当前时间进行比较。然后,您需要一种将这个指标报告回服务器的方法——您可以使用 Ajax 请求,或者将时间存储在另一个 cookie 中以在后续请求中显示。
Note that the files required by each client will depend on the current state of the browser side cache.
请注意,每个客户端所需的文件将取决于浏览器端缓存的当前状态。
If you can isolate click streams from your logs, then you can get a good approximation by checking the interval between a request for a text/html content type and the last consecutive request for content type other than text/html. But your stats will get skewed if users interact usnig more than one browser window simultaeneously.
如果您可以从日志中隔离点击流,那么您可以通过检查对 text/html 内容类型的请求与对 text/html 以外的内容类型的最后一个连续请求之间的间隔来获得一个很好的近似值。但是,如果用户同时与多个浏览器窗口交互,您的统计数据就会出现偏差。
回答by Benoit
You can use microtime()at the start of processing and at end of output, then calculate the difference and convert it to seconds if wanted.
您可以在处理开始和输出结束时使用microtime(),然后计算差异并将其转换为秒(如果需要)。
This will only measure the execution time for PHP side, not the whole page load time at it seems to be in your link, but it will able you to compare various methods performance, for instance.
这只会测量 PHP 端的执行时间,而不是整个页面加载时间,它似乎在您的链接中,但它可以让您比较各种方法的性能,例如。
回答by Your Common Sense
- method one: use xdebug.
method two: Put these statements all around your your scripts
$TIMER['label']=microtime(1);/* some code */$TIMER['sql1_before']=microtime(1);a/* some code */$TIMER['sql1_after']=microtime(1);/* some code */
- 方法一:使用xdebug。
方法二:将这些语句放在你的脚本中
$TIMER['label']=microtime(1);/* some code */$TIMER['sql1_before']=microtime(1);a/* some code */$TIMER['sql1_after']=microtime(1);/* some code */
and then output it, with code like this:
然后输出它,代码如下:
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>";
Thus, you'll get tetailed report on how your code goes.
this action called profilingand take most important place in the optimization process.
因此,您将获得有关代码运行情况的详细报告。此操作称为profiling并在优化过程中占据最重要的位置。
回答by MGriesbach
The Output in that presentation seem to be copied from Siege (http://www.joedog.org/index/siege-home).
该演示文稿中的输出似乎是从 Siege ( http://www.joedog.org/index/siege-home)复制的。
Another quite useful tool for "real world" performance testing your whole application stack is Firebug (http://getfirebug.com/) and YSlow (http://developer.yahoo.com/yslow/)
另一个用于“真实世界”性能测试的非常有用的工具是 Firebug ( http://getfirebug.com/) 和 YSlow ( http://developer.yahoo.com/yslow/)
回答by Suneel Kumar
Using microtime() PHP function you will know exactly how much time is needed for your PHP code to be executed. Follow the steps below to put the PHP code on your web page:
使用 microtime() PHP 函数,您将确切知道执行 PHP 代码所需的时间。按照以下步骤将 PHP 代码放在您的网页上:
Put the following code at the very top of your PHP page (if you measure the time needed for particular part of the code put this right before that PHP code part)
将以下代码放在 PHP 页面的最顶部(如果您测量特定代码部分所需的时间,请将其放在该 PHP 代码部分之前)
<?php
$time = microtime();
$time = explode(' ', $time);
$time = $time[1] + $time[0];
$start = $time;
?>
The following code has to be put at the very end of the web page (or the end of the PHP code part)
以下代码必须放在网页的最后(或 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.';
If not works use microtime(true) instead of microtime()
如果不起作用,请使用 microtime(true) 而不是 microtime()
回答by Shoaib Quraishi
Put the following code at the top of your PHP page.
将以下代码放在 PHP 页面的顶部。
<?php
$statrttime = microtime();
$time = explode(' ', $statrttime);
$time = $time[1] + $time[0];
$start = $time;
?>
The following code has to be put at the end of your page.
以下代码必须放在页面的末尾。
<?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.';
?>
Note: If you measure the time for particular part of the code put this right start and last PHP code part.
注意:如果您测量代码特定部分的时间,请正确开始和最后一个 PHP 代码部分。

