使用PHP测量(和优化)性能的最佳方法?

时间:2010-10-07 09:02:20

标签: php testing

我正在使用的网站开始变得有点迟钝,我想改进它。我认为问题出在PHP上,但我不能确定。如何查看函数执行的时间有多长?

6 个答案:

答案 0 :(得分:17)

如果您想测试执行时间:

<?php
    $startTime = microtime(true);  
    // Your content to test
    $endTime = microtime(true);  
    $elapsed = $endTime - $startTime;
    echo "Execution time : $elapsed seconds";
?>

答案 1 :(得分:5)

在XDebug或Zend Debugger中尝试使用探查器功能?

答案 2 :(得分:1)

你可以做两件事。 将Microtime称为无处不在但如果您想测试多个功能则不方便。因此,如果您想测试我想要做的许多功能,有一种更简单的方法可以做到更好的解决方案。 只需要一个类(点击链接以跟随教程),你可以测试你的所有功能需要多长时间。而不是在任何地方放置microtime。你只需要使用这个课程。这很方便

http://codeaid.net/php/calculate-script-execution-time-%28php-class%29

您可以做的第二件事是通过查看内存使用情况来优化脚本。 通过观察脚本的内存使用情况,您可以更好地优化代码。

PHP有一个垃圾收集器和一个非常复杂的内存管理器。脚本使用的内存量。可以在执行脚本期间上下移动。为了获得当前的内存使用量,我们可以使用memory_get_usage()函数,并且为了获得在任何点使用的最大内存量,我们可以使用memory_get_peak_usage()函数。 查看plaincopy到clipboardprint?

   echo "Initial: ".memory_get_usage()." bytes \n";  
   /* prints 
   Initial: 361400 bytes 
   */  

   // let's use up some memory  
   for ($i = 0; $i < 100000; $i++) {  
       $array []= md5($i);  
   }  

  // let's remove half of the array  
  for ($i = 0; $i < 100000; $i++) {  
     unset($array[$i]);  
  }  

  echo "Final: ".memory_get_usage()." bytes \n";  
  /* prints 
  Final: 885912 bytes 
  */  

  echo "Peak: ".memory_get_peak_usage()." bytes \n";  
  /* prints 
  Peak: 13687072 bytes 
  */  

http://net.tutsplus.com/tutorials/php/9-useful-php-functions-and-features-you-need-to-know/

<强> PK

答案 3 :(得分:0)

  • 您也可以通过在不同位置记录microtime()值来手动创建,如下所示:

    <?
    $TIMER['start']=microtime(TRUE);
    // some code
    $query="SELECT ...";
    $TIMER['before q']=microtime(TRUE);
    $res=mysql_query($query);
    $TIMER['after q']=microtime(TRUE);  
    while ($row = mysql_fetch_array($res)) {
    // some code
    }
    $TIMER['array filled']=microtime(TRUE);  
    // some code
    $TIMER['pagination']=microtime(TRUE);  
    /and so on
    ?>
    

然后将其可视化

<?
if ('127.0.0.1' === $_SERVER['REMOTE_ADDR']) {
  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>";
}
?>

IP地址检查意味着我们正在工作站点上进行此分析

  • 虽然我怀疑这是PHP本身。很可能是它的数据库。所以,要特别注意查询执行时间。

  • 然而,“网站”术语非常广泛。它还包括JS,CSS,图像和东西。因此,我建议从FirebFug的Net页面开始,看看整个页面的哪个部分需要更多时间。

当然,只有在分析分析结果后才能进行精炼,没有它就不能在这里建议。

答案 4 :(得分:0)

你最好的选择是Xdebug。我很开心因为它捆绑在我的PHPed IDE中。只需点击一下按钮,我就可以获得分析器数据。

所以也许你可以考虑一下。

答案 5 :(得分:0)

我有类似的问题,所以我在数据库上创建了2个新表和两个新函数。一个是audit_sql,另一个是audit_code。因为我使用了SQL抽象类,所以很容易为每个SQL调用计时(我使用了php microtime,正如其他人所建议的那样)。因此,我在SQL调用之前和之后调用了microtime,并将结果存储在数据库中。

与页面类似。我在每页的开头和结尾打电话给microtime,如有必要,在功能的开头和结尾,divs - 我认为可能是罪魁祸首。

一般结果是:

  1. 对MySQL的SQL调用几乎是即时的,根本不存在问题。我唯一要说的是,即使我对正在执行的号码感到惊讶!该站点是从数据库生成的 - 甚至是菜单,权限等。为了生成主页,SQL调用是在100秒内测量的。

  2. PHP不是罪魁祸首。这比MySQL更加即时。

  3. 罪魁祸首是....(大建立!)给You Tube和Picassa以及其他类似的网站打电话。我在网站上托管视频和相册(好吧,我实际上并不存储它们 - 它们存储在YT上等),而在主页上是通过You Tube PHP API从You Tube等中提取的缩略图/ Zend框架。因为这是基于其他站点的所有http,每个站点需要1,2或3秒。这导致包含这些的div占用6到12秒,主页占用17秒。

  4. 解决方案 - 将所有缩略图存储在我的服务器上。第一次必须从远程站点(YT,Picassa等)提供服务,然后将其存储在您自己的站点上。将来,您将检查是否拥有它,如果是这样,请始终从您的服务器提供服务。将页面加载时间缩短至2-3秒。当有人加载了更多视频/图像后,第一个看到第一个主页加载的人需要一些时间,但此后却没有。人们会将长时间的一次性页面加载时间放到他们的连接/一般的互联网上。您站点的负载太慢,他们将停止访问!

    我希望这有所帮助。