用 PHP 衡量(和改进)性能的最佳方法是啥?
Posted
技术标签:
【中文标题】用 PHP 衡量(和改进)性能的最佳方法是啥?【英文标题】:best way to measure (and refine) performance with PHP?用 PHP 衡量(和改进)性能的最佳方法是什么? 【发布时间】:2010-10-07 09:02:19 【问题描述】:我正在使用的一个网站开始变得有点迟钝,我想改进它。我认为问题出在 php 上,但我不能确定。如何查看函数执行需要多长时间?
【问题讨论】:
看看***.com/questions/55720/… 【参考方案1】:如果要测试执行时间:
<?php
$startTime = microtime(true);
// Your content to test
$endTime = microtime(true);
$elapsed = $endTime - $startTime;
echo "Execution time : $elapsed seconds";
?>
【讨论】:
【参考方案2】:试试 XDebug 或 Zend Debugger 中的分析器功能?
【讨论】:
使用这些有很多学习曲线吗?目前我使用 textmate、firefox、firebug 和 firephp 的组合(上帝派!) 与您当前的设置相比,XDebug 和 Zend Debugger 处于不同的联盟。我发现 Zend Debugger 非常容易使用(我使用 Zend Studio)。如果您想要认真优化,那么我建议您使用其中之一。【参考方案3】:你可以做两件事。 随处放置 Microtime 调用,但如果您想测试多个函数,它并不方便。因此,如果您想测试我假设您想做的许多功能,那么有一种更简单的方法可以实现更好的解决方案。 只需上一堂课(单击链接以跟随教程),您可以在其中测试所有功能需要多长时间。而不是到处放置微时间。你只需使用这个类。很方便
http://codeaid.net/php/calculate-script-execution-time-%28php-class%29
您可以做的第二件事是通过查看内存使用情况来优化您的脚本。 通过观察脚本的内存使用情况,您可以更好地优化代码。
PHP 有一个垃圾收集器和一个相当复杂的内存管理器。脚本使用的内存量。在脚本执行期间可以上下移动。要获取当前内存使用情况,我们可以使用 memory_get_usage() 函数,而要获取任何时候使用的最高内存量,我们可以使用 memory_get_peak_usage() 函数。 将纯副本查看到剪贴板打印?
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
【讨论】:
【参考方案4】:您也可以手动制作,方法是在各个位置记录 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 的网页开始,看看整个页面的哪个部分需要更多时间。
当然,精炼只能在分析分析结果后进行,如果没有它,这里就不建议了。
【讨论】:
我认为它是后端的原因是因为 firebug 配置文件需要一段时间才能启动。它滞后于对服务器的调用。它也在本地执行,因此在我看来,这排除了服务器性能,尽管我远非服务器专家。 数据库查询是由 wordpress API 处理的,所以不确定在不重写***的情况下我能做多少,这会在一定程度上否定使用 wordpress 的意义。 @Mild PHP 后端当然也暗示 SQL 调用。 SQL 是后端工作的一部分。无论如何,只有分析才能告诉我们【参考方案5】:您最好的选择是 Xdebug。我很高兴它捆绑在我的 PHPed IDE 中。我可以通过单击按钮获取分析器数据。
所以也许你可以考虑一下。
【讨论】:
您不能使用您宝贵的 IDE 来分析远程服务器。至少除非在那里安装了 xdebug 扩展。而本地开发服务器的分析几乎没用 我认为本地分析是没有用的。虽然两台机器上的性能数据可能不一样,但负载的比例仍然存在,因此您仍然可以找到瓶颈。【参考方案6】:我有类似的问题,所以我在数据库上创建了 2 个新表和两个新函数。一个是audit_sql,另一个是audit_code。因为我使用了一个 SQL 抽象类,所以很容易对每个 SQL 调用进行计时(我使用了 php microtime,正如其他人所建议的那样)。因此,我在 SQL 调用前后调用了 microtime,并将结果存储在数据库中。
与页面类似。我在每个页面的开头和结尾调用了 microtime,如果有必要,在函数、div 的开头和结尾调用了 microtime——我认为可能是罪魁祸首。
一般结果是:
对 MySQL 的 SQL 调用几乎是即时的,根本没有问题。我唯一想说的是,即使我对被处决的人数也感到惊讶!该站点是从数据库生成的——甚至是菜单、权限等。为了生成主页,SQL 调用以 100 秒为单位进行测量。
PHP 不是罪魁祸首。这比 MySQL 更加即时。
罪魁祸首是....(大增!)调用 You Tube 和 Picassa 以及其他类似网站。我在网站上托管视频和相册(嗯,我实际上并没有存储它们 - 它们存储在 YT 等上),主页上是通过 You Tube PHP API 从 You Tube 等中提取的缩略图/Zend 框架。因为这都是基于其他站点的 http,所以每个站点都需要 1、2 或 3 秒。这导致包含这些的 div 需要 6 到 12 秒,而主页则需要 17 秒。
解决方案 - 将所有缩略图存储在我的服务器上。第一次必须从远程站点(YT、Picassa 等)提供服务,然后将其存储在您自己的站点上。将来,您检查是否有它,如果有,则始终从您的服务器上提供它。将页面加载时间缩短到 2-3 秒。在有人加载更多视频/图像后,第一个查看第一个主页加载的人需要一些时间,但此后不会。人们通常会将较长的一次性页面加载时间归结为他们的连接/互联网。您的网站加载速度太慢,他们将停止访问!
希望对你有所帮助。
【讨论】:
以上是关于用 PHP 衡量(和改进)性能的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章