交叉发布我从 SO Documentation beta 中离线的参考。
使用 XDebug 进行分析
一个名为 Xdebug 的 PHP 扩展可用于协助profiling PHP applications 以及运行时调试。运行探查器时,输出以称为“cachegrind”的二进制格式写入文件。每个平台上都有应用程序来分析这些文件。 无需更改应用程序代码即可执行此分析。
要启用分析,请安装扩展并调整 php.ini 设置。一些 Linux 发行版带有标准包(例如 Ubuntu 的 php-xdebug 包)。在我们的示例中,我们将根据请求参数可选地运行配置文件。这使我们可以保持设置静态并仅在需要时打开分析器。
# php.ini settings
# Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
# Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
# The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
# Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
接下来使用网络客户端向您希望分析的应用程序的 URL 发出请求,例如
http://example.com/article/1?XDEBUG_PROFILE=1
当页面处理时,它将写入一个名称类似于
的文件
/tmp/cachegrind.out.12345
默认情况下,文件名中的数字是写入它的进程 ID。这可以通过xdebug.profiler_output_name 设置进行配置。
请注意,它会为每个执行的 PHP 请求/进程写入一个文件。因此,例如,如果您希望分析表单帖子,将为 GET 请求编写一个配置文件以显示 HTML 表单。 XDEBUG_PROFILE 参数将需要传递到后续的 POST 请求中,以分析处理表单的第二个请求。因此,在进行分析时,有时运行 curl 直接 POST 表单会更容易。
分析输出
配置文件缓存一旦写入,就可以被KCachegrind 或Webgrind 等应用程序读取。 PHPStorm,一个流行的PHP IDE,也可以display this profiling data.
例如,KCachegrind 将显示以下信息:
- 执行的函数
- 调用时间,包括其本身和后续函数调用的时间
- 每个函数的调用次数
- 调用图
- 源代码链接
寻找什么
显然,性能调优对每个应用程序的用例都非常具体。一般来说,最好寻找:
- 重复调用您不希望看到的同一函数。对于处理和查询数据的函数,这些可能是您的应用缓存的主要机会。
- 运行缓慢的函数。应用程序将大部分时间花在哪里?性能调优的最佳回报是关注应用程序中消耗时间最多的部分。
注意:Xdebug,尤其是它的分析功能,是非常耗费资源的,并且会减慢 PHP 的执行速度。建议不要在生产服务器环境中运行这些。