【发布时间】:2010-10-07 09:02:19
【问题描述】:
我正在使用的一个网站开始变得有点迟钝,我想改进它。我认为问题出在 PHP 上,但我不能确定。如何查看函数执行需要多长时间?
【问题讨论】:
我正在使用的一个网站开始变得有点迟钝,我想改进它。我认为问题出在 PHP 上,但我不能确定。如何查看函数执行需要多长时间?
【问题讨论】:
如果要测试执行时间:
<?php
$startTime = microtime(true);
// Your content to test
$endTime = microtime(true);
$elapsed = $endTime - $startTime;
echo "Execution time : $elapsed seconds";
?>
【讨论】:
试试 XDebug 或 Zend Debugger 中的分析器功能?
【讨论】:
你可以做两件事。 随处放置 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
【讨论】:
您也可以手动制作,方法是在各个位置记录 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 的网页开始,看看整个页面的哪个部分需要更多时间。
当然,精炼只能在分析分析结果后进行,如果没有它,这里就不建议了。
【讨论】:
您最好的选择是 Xdebug。我很高兴它捆绑在我的 PHPed IDE 中。我可以通过单击按钮获取分析器数据。
所以也许你可以考虑一下。
【讨论】:
我有类似的问题,所以我在数据库上创建了 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 秒。在有人加载更多视频/图像后,第一个查看第一个主页加载的人需要一些时间,但此后不会。人们通常会将较长的一次性页面加载时间归结为他们的连接/互联网。您的网站加载速度太慢,他们将停止访问!
希望对你有所帮助。
【讨论】: