找出PHP代码在哪里变慢(性能问题)
这是我在SO提出的第一个问题。
我有我公司最近要维护的内部应用程序。这些应用程序是用PHP构建的,其编码(OO,DB Abstraction,Smarty)相当好,没有WTF的味道。
问题是应用程序非常慢。
如何找出导致应用程序速度下降的原因?我已经对代码进行了优化,使其几乎不执行数据库查询,因此我知道这是需要一段时间才能执行的PHP代码。我需要获得一些可以帮助我解决此问题的工具,并且需要制定一种策略来检查我的代码。
我可以自己执行检查/策略工作,但是我需要更多的PHP工具来确定我的应用程序在哪里发展。
有什么想法吗?
解决方案
回答
最近,在类似情况下,我使用了XDebug分析。它输出一个完整的配置文件报告,可以用许多常见的分析应用程序读取(但是无法给我们列表,我只是使用了slackware附带的报告)。
回答
我们使用Zend开发环境(windows)。昨天,我们通过在运行Process Explorer的过程中逐步调试程序来解决了内存使用量激增的问题,以观察每行执行时的内存/ CPU /磁盘活动。
流程浏览器:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx。
ZDE包括一个基本的性能分析器,它可以显示页面请求期间每个函数调用所花费的时间。
回答
我结合使用了PEAR Benchmark和log4php。
在要配置的脚本的顶部,我创建了一个环绕Benchmark_Timer对象的对象。在整个代码中,我添加了$ object-> setMarker(" name");调用,尤其是在可疑代码周围。
wrapper类有一个destroy方法,该方法获取日志记录信息并将其写入log4php。我通常将其发送到syslog(许多服务器,聚合到一台服务器上的一个日志文件中)。
在调试中,我可以查看日志文件,并查看需要改进的地方。稍后在生产中,我可以解析日志文件并进行性能分析。
它不是xdebug,但始终处于启用状态,使我能够比较代码的任意两个执行。
回答
正如Juan所提到的,xDebug非常出色。如果我们使用的是Windows,则WinCacheGrind将允许我们查看报告。
回答
观看Rasmus Lerdorf(PHP的创建者)的演示文稿。他列举了一些很好的例子来测试PHP的速度和查找内容,以及一些会使速度变慢的内部组件。 XDebug是他使用的一种工具。他还非常了解了解框架带来的性能成本。
视频:
http://www.archive.org/details/simple_is_hard
幻灯片(由于很难在视频中看到):
http://talks.php.net/show/drupal08/1
回答
如果它的代码量很大,如果还没有,请尝试使用apc。
http://pecl.php.net/package/APC
回答
phpED(http://www.nusphere.com/products/phped.htm)还提供了出色的调试和分析功能,并能够在PHP代码中添加监视,断点等功能。集成的探查器直接在IDE中提供了每个函数调用和类方法的时间分解。浏览器插件还可以实现与Firefox或者IE的快速集成(即使用浏览器访问慢速URL,然后单击按钮进行配置或者调试)。
指出应用程序运行缓慢的位置以集中大部分编码工作非常有用。并且避免了浪费时间来优化已经快速的代码。在尝试过Zend和Eclipse之后,我现在已经因为使用phpED的易用性而被推销。
请记住,在针对Web服务器进行调试时,Xdebug和phpED(带DBG)都需要安装额外的PHP模块。 phpED还提供了(由我试用)本地调试选项。
回答
我们也可以尝试在php中使用register_tick_function函数。告诉php在代码中定期调用某个函数。然后,我们可以跟踪当前正在运行哪个功能以及两次调用之间的时间间隔。那么我们会看到花费最多的时间。
http://www.php.net/register_tick_function
回答
Xdebug配置文件绝对是必经之路。另一个提示WincacheGrind很好,但是最近没有更新。在浏览器中http://code.google.com/p/webgrind/可能是一种便捷的选择。
虽然有可能,但它仍然仍然是数据库。检查相关索引,并确保它有足够的内存来缓存尽可能多的工作数据。
回答
有很多变量可能会影响应用程序的性能。我建议我们不要立即假设PHP是问题所在。
首先,我们如何使用PHP?我们是否尝试过对Apache或者IIS本身进行基本优化?服务器是否正在忙于处理其他类型的请求?我们是否利用了PHP代码加速器?测试服务器是否成为瓶颈的一种方法是尝试在另一台服务器上运行该应用程序。
其次,整个应用程序的性能是否变慢,还是似乎只影响某些页面?这可以为我们提供从何处开始分析性能的指示。如果整个应用程序运行缓慢,则问题很可能出现在基础服务器/平台中,或者是每个请求(例如,用户身份验证)中包含的全局SQL查询。
第三,我们提到了最小化SQL查询的数量,但是如何优化现有查询呢?如果我们使用的是MySQL,我们是否在利用每个存储系统的各种优势?我们是否对最重要的查询运行EXPLAIN以确保正确索引了它们?这对于访问大表的查询至关重要。数据集越大,我们越会注意到索引编制不佳的影响。幸运的是,有很多这样的文章,它们解释了如何使用EXPLAIN。
第四,一个常见的错误是假定数据库服务器将自动使用系统可用的所有资源。我们应该检查以确保已为数据库应用程序明确分配了足够的资源。例如,在MySQL中,我们将想要为自定义设置(在my.cnf文件中)添加诸如键缓冲区,临时表大小,线程并发,innodb缓冲池大小等的设置。
如果我们仔细检查了以上所有内容,但仍然找不到瓶颈,那么像Xdebug这样的代码分析器绝对可以提供帮助。就个人而言,我更喜欢Zend Studio探查器,但它可能不是最好的选择,除非我们已经充分利用了Zend Platform堆栈的其余部分。但是,以我的经验,PHP本身是性能降低的根本原因,这种情况很少见。通常,代码分析器可以更精确地确定应归咎于哪些数据库查询。