30

这是我在 SO 的第一个问题。

我最近被要求维护我公司的内部应用程序。这些应用程序是用 PHP 构建的,它的编码相当好(OO、DB Abstraction、Smarty),没有什么 WTF 风格。

问题是应用程序很慢

如何找出导致应用程序速度变慢的原因?我已经优化了代码以进行很少的数据库查询,所以我知道是 PHP 代码需要一段时间才能执行。我需要一些工具来帮助我解决这个问题,并且需要设计一个检查我的代码的策略。

我可以自己进行检查/策略工作,但我需要更多 PHP 工具来确定我的应用程序在哪里出错。

想法?

4

12 回答 12

40

我最近在类似的情况下使用了XDebug 分析。它输出一个完整的配置文件报告,可以使用许多常见的分析应用程序读取(虽然不能给你一个列表,我只是使用了 slackware 附带的一个)。

于 2008-09-11T03:06:52.313 回答
9

正如 Juan 提到的,xDebug 非常好。如果您使用的是 Windows,WinCacheGrind会让您查看报告。

于 2008-09-11T14:58:28.687 回答
6

观看 Rasmus Lerdorf(PHP 的创建者)的演示文稿。他介绍了一些测试 PHP 速度和寻找什么的好例子,以及一些可以减慢速度的内部结构。XDebug 是他使用的一种工具。他还提出了一个非常明确的观点,即了解您使用框架会带来哪些性能成本。

视频: http ://www.archive.org/details/simple_is_hard

幻灯片(因为很难在视频中看到): http ://talks.php.net/show/drupal08/1

于 2008-09-11T19:37:26.583 回答
4

有许多变量会影响您的应用程序的性能。我建议您不要立即认为 PHP 是问题所在。

首先,您如何为 PHP 提供服务?您是否尝试过 Apache 或 IIS 本身的基本优化?服务器是否忙于处理其他类型的请求?您是否利用了PHP 代码加速器?测试服务器是否是您的瓶颈的一种方法是尝试在另一台服务器上运行应用程序。

其次,整个应用程序的性能是否缓慢,或者它似乎只影响某些页面?这可以告诉您从哪里开始分析性能。如果整个应用程序很慢,则问题更可能出现在底层服务器/平台中,或者是作为每个请求的一部分的全局 SQL 查询(例如,用户身份验证)。

第三,您提到最小化 SQL 查询的数量,但是优化现有查询呢?如果您使用 MySQL,您是否利用了每个存储系统的各种优势?您是否对最重要的查询运行EXPLAIN以确保它们被正确索引?这对于访问大表的查询至关重要;数据集越大,您越会注意到索引不佳的影响。幸运的是,有很多像这篇文章这样解释如何使用 EXPLAIN 的文章。

第四,一个常见的错误是假设您的数据库服务器会自动使用系统可用的所有资源。您应该检查以确保您已为数据库应用程序显式分配了足够的资源。例如,在 MySQL 中,您需要为键缓冲区、临时表大小、线程并发性、innodb 缓冲池大小等添加自定义设置(在 my.cnf 文件中)。

如果您已经仔细检查了以上所有内容,但仍然无法找到瓶颈,那么 Xdebug 之类的代码分析器绝对可以提供帮助。就个人而言,我更喜欢 Zend Studio 分析器,但它可能不是最佳选择,除非您已经在利用 Zend 平台堆栈的其余部分。然而,根据我的经验,PHP 本身是性能缓慢的根本原因是非常罕见的。通常,代码分析器可以帮助您更准确地确定哪些数据库查询应受到指责。

于 2008-09-15T16:28:45.770 回答
3

您也可以使用APD(高级 PHP 调试器)。

让它工作很容易。

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

有一个很好的教程如何编译 APD 并使用它进行分析:http ://martinsikora.com/compiling-apd-for-php-54

于 2013-03-30T09:51:33.740 回答
2

phpED ( http://www.nusphere.com/products/phped.htm ) 还提供了很好的调试和分析功能,以及在 PHP 代码中添加监视、断点等的能力。集成分析器直接提供 IDE 中每个函数调用和类方法的时间分解。浏览器插件还可以与 Firefox 或 IE 快速集成(即用浏览器访问慢速 URL,然后单击按钮进行分析或调试)。

它在指出应用程序慢的地方以集中大部分编码工作时非常有用;它避免浪费时间优化已经很快的代码。在尝试过 Zend 和 Eclipse 之后,我现在已经被 phpED 的易用性所吸引。

请记住,在针对 Web 服务器进行调试时,Xdebug 和 phpED(带有 DBG)都需要安装额外的 PHP 模块。phpED 还提供(我未尝试过)本地调试选项。

于 2008-09-11T21:02:48.950 回答
2

Xdebug 配置文件绝对是要走的路。另一个提示 - WincacheGrind 很好,但最近没有更新。 http://code.google.com/p/webgrind/ - 在浏览器中可能是一种简单快捷的选择。

但有可能,它仍然是数据库。检查相关索引 - 并且它有足够的内存来缓存尽可能多的工作数据。

于 2008-09-13T00:24:34.370 回答
1

如果它的代码库很大,如果您还没有,请尝试 apc。

http://pecl.php.net/package/APC

于 2008-09-11T20:32:06.047 回答
1

您也可以尝试使用 php.ini 中的 register_tick_function 函数。它告诉 php 在您的代码中定期调用某个函数。然后,您可以跟踪当前正在运行的函数以及调用之间的时间量。然后你可以看到什么是花费最多的时间。 http://www.php.net/register_tick_function

于 2008-09-12T19:11:09.803 回答
0

我们使用 Zend 开发环境(windows)。昨天,我们通过在运行 Process Explorer 时单步调试调试器来解决内存使用高峰问题,以观察每行执行时的内存/cpu/磁盘活动。

进程资源管理器:http ://technet.microsoft.com/en-us/sysinternals/bb896653.aspx 。

ZDE 包括一个基本的性能分析器,它可以显示页面请求期间每个函数调用所花费的时间。

于 2008-09-11T03:47:59.610 回答
0

我使用PEAR Benchmarklog4php的组合。

在我想要分析的脚本顶部,我创建了一个环绕Benchmark_Timer对象的对象。在整个代码中,我添加了$object->setMarker("name");调用,尤其是在可疑代码周围。

包装类有一个 destroy 方法,它获取日志信息并将其写入 log4php。我通常将其发送到系统日志(许多服务器,聚合到一台服务器上的一个日志文件)。

在调试中,我可以查看日志文件并查看需要改进的地方。稍后在生产中,我可以解析日志文件并进行性能分析。

它不是 xdebug,但它始终处于打开状态,使我能够比较代码的任意两次执行。

于 2008-09-11T14:50:03.340 回答
0

如果您的服务器性能下降是应用程序处理缓慢的原因,您还可以查看HA 代理或任何其他负载平衡解决方案。服务器。

于 2015-05-13T08:38:04.280 回答