(转)使用 xdebug profiler 对 php 做性能分析
11 July 2018
原文: 使用 xdebug profiler 对 php 做性能分析

作为 PHP 程序员我们或多或少都了解或使用过 xdebug。此文章记录安装和配置 xdebug,以及如何使用它来分析 php 程序。

我的机器环境:mac, php 7.2

安装 xdebug

推荐使用 pecl 安装扩展

pecl install xdebug

启用和配置

如果不知道 php 的配置文件,可以用 php --ini 查看
启用 xdebug,添加一个独立的 ext-xdebug.ini 到 php 的配置目录

[xdebug]
zend_extension="xdebug.so"
# profiler 功能的开关,默认值 0,如果设为 1,则每次请求都会生成一个性能报告文件。
# xdebug.profiler_enable=0
# 默认值是 0,如果设为 1 则当我们的请求中包含 XDEBUG_PROFILE 参数时才会生成性能报告文件
xdebug.profiler_enable_trigger=1
# 分析文件保存目录, 默认是 /var/tmp
xdebug.profiler_output_dir="/var/tmp/xdebug"

现在使用 php -m 能看到 xdebug,并且使用 php --ri xdebug 能看到配置项都生效就 ok 了。

访问并生成分析文件

使用 fpm 要重启,扩展才能生效

现在我们可以访问 php 项目,记得在请求参数带上 XDEBUG_PROFILE, 类似 http://127.0.0.1:5671/my?XDEBUG_PROFILE

ok, 现在 xdebug 应该已经在我们配置的分析文件保存目录产生了文件, 类似

% ll /var/tmp/xdebug
-rw-r--r--  1 user  group    48K  4 29 13:40 cachegrind.out.37947

生成的分析文件直接查看是难以阅读的。所以我们要使用分析查看工具

分析查看工具

使用 qcachegrind

要查看分析图表,需要安装 graphviz

brew install graphviz

安装 qcachegrind

brew install qcachegrind

在命令行里使用 qcachegrind 打开它,然后通过它打开要分析的文件。
也可以在命令后直接跟要分析的文件 qcachegrind /var/tmp/xdebug/cachegrind.out.37947

使用 webgrind

下载:https://github.com/jokkedk/webgrind

要查看分析图表,同样需要安装 graphviz

分析的时候 "Call Graph" 功能用不了
方法 1

sudo ln -s /usr/local/bin/dot /usr/bin/dot

方法 2

修改 config.php
/**
 * Path to graphviz dot executable
 */
static $dotExecutable = '/usr/local/bin/dot';
// static $dotExecutable = '/usr/bin/dot';

运行:

php -S 0.0.0.0:8081 index.php

现在,你可以访问:http://localhost:8081

后记 (这段不是原文的内容)

通过 xdebug profiler,我在预发布环境优化过一段代码。当时前端反馈一个接口返回要 3 秒多,我心想肯定是哪里没走索引。
利用xdebug profiler 生成 cachegrind.out ,然后下载到本地开发环境。
利用 qcachegrind 很快就定位到相应的位置,加上了索引,fix