计算PHP脚本的最佳方式

时间:2010-02-27 07:30:27

标签: php

查看PHP脚本运行所需时间的最佳方法是什么?

我在想这样的事情:

$start_time = time(); //this at the beginning
$end_time = time(); //this at the end
echo = $end_time-$start_time;

但是我怎样才能把它变成对我来说可读并对我有意义的东西呢?

5 个答案:

答案 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()的奖励,这会减慢你的脚本速度。

http://xdebug.org/docs/profiler

http://xdebug.org/docs/

答案 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();
  }

 }