查看PHP脚本运行所需时间的最佳方法是什么?
我在想这样的事情:
$start_time = time(); //this at the beginning
$end_time = time(); //this at the end
echo = $end_time-$start_time;
但是我怎样才能把它变成对我来说可读并对我有意义的东西呢?
答案 0 :(得分:5)
如果您希望时间比秒更精细,则需要使用microtime()
(以微秒为单位返回当前Unix时间戳)
<?php
$time_start = microtime(true);
// Sleep for a while
usleep(100);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Did nothing in $time seconds\n";
?>
**以后添加了**
进一步格式化此结果:
嗯,根据你正在做的事情,你通常没有超过一分钟的脚本。你绝对不应该超过一个小时。 (如果你这样做,你需要问问自己你的生活是做什么的)
考虑到这一点,您只需要简单的计算:
$tmp = floor($time);
$minutes = $tmp / 60;
$seconds = ($tmp % 60) + ($time - $tmp);
$output = 'Script took ';
if ($minutes > 0) $output .= $minutes . ' minutes and ';
$output .= $seconds . ' seconds to complete.';
echo $output;
(这未经过测试,可能会进行优化,但应该以正确的方向开始)
答案 1 :(得分:3)
我会改用microtime(TRUE)
。这将以微秒分辨率为您提供更好的结果。还有PECL APD extension个人资料脚本。
在APD上扩展一点,假设有一个安装了APD,你只需要添加一行
apd_set_pprof_trace();
到脚本的顶部(或者每当你想开始跟踪时)。它使用pprofp生成一个分析文件,生成非常易读的输出
Real User System secs/ cumm
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0009 0 main
56.9 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0005 0.0005 0 apd_set_pprof_trace
28.0 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000 0 preg_replace
示例输出来自PHP手册。
我个人认为APD非常有用,并且在频繁出现的剧本中经常使用它。
答案 2 :(得分:2)
知道运行多长时间是一回事,找出它在哪里(在你的php操作中)它减速以及为什么是另一个问题。
如果您真的想找到后一个问题的答案,那么安装xdebug,你就可以获得不必调用microtime()的奖励,这会减慢你的脚本速度。
答案 3 :(得分:1)
这是一个可通过Web访问的脚本(即http://www.yoursite.com/BLA.php),还是通过命令行运行的脚本?如果是命令行脚本,则可以使用time命令:
time php FILE.php
否则,microtime可能是你最好的选择。
答案 4 :(得分:1)
我发现这个类对于脚本计时非常有用,microtime
成为了朋友:
class timer
{
private $start_time = NULL;
private $end_time = NULL;
private function getmicrotime()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
function start()
{
$this->start_time = $this->getmicrotime();
}
function stop()
{
$this->end_time = $this->getmicrotime();
}
function result()
{
if (is_null($this->start_time))
{
exit('Timer: start method not called !');
return false;
}
else if (is_null($this->end_time))
{
exit('Timer: stop method not called !');
return false;
}
return round(($this->end_time - $this->start_time), 4);
}
# an alias of result function
function time()
{
$this->result();
}
}