使用XDebug Profile PHP性能

接上一篇《使用XDebug加PHPStorm远程调试PHP》https://mnstory.net/2017/10/14/phpstorm-remote-debug-with-xdebug ,既然我们已经按照好了XDebug,那再试试其Profile功能。

配置

php.ini文件,同样需要配置:

1
2
3
4
5
6
zend_extension = $phproot/lib/php/extensions/xdebug.so
[xdebug]
xdebug.auto_trace = 1 # 这个必须开启
xdebug.profiler_enable = 0 # 这个为1的话,类似于 remote_autostart 为 1, 会自动启动Profile,而一般情况下,我们都希望能控制具体对那一次请求做Profile,所以,这个字段建议设置为0
xdebug.profiler_enable_trigger = 1 # 和profiler_enable的区别在于,这个需要XDEBUG_PROFILE变量来控制是否profiler
xdebug.profiler_output_dir = "/tmp/profiler" #配置输出目录,默认是/tmp

和调试的配置合并后,即为:

1
2
3
4
5
6
7
8
9
10
zend_extension = $phproot/lib/php/extensions/xdebug.so
[xdebug]
xdebug.idekey = "PHPSTORM"
xdebug.remote_enable = 1
xdebug.remote_connect_back = 0
xdebug.remote_port = 9909
xdebug.auto_trace = 1
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = "/tmp/profiler"

注意,profiler_output_dir一定是apache进程可读写的,查看一下apache进程的user和group,设置一下,例如我的user和group都是daemon:

1
2
mkdir /tmp/profiler
chown daemon:daemon /tmp/profiler

同样,配置完成后,请重启apache。

安装工具

查看Profile结果,可以使用QCacheGrind Windows版本,直接打开生成的profiler_output_dir目录下的任何一个文件即可,下载地址: https://sourceforge.net/projects/qcachegrindwin/?source=typ_redirect

当然,WEB版本更方便一些,但是功能弱一点,主要是不需要将服务器上profiler_output_dir目录的文件同步到PC机,可在 https://github.com/jokkedk/webgrind/wiki/Installation 下载,解压到服务器上Apache的Document Root目录,用URL访问即可。但是网页版的要生成调用关系需要自己安装dot工具,对于我这个不能上网的服务器,比较麻烦一点,再次使用反向代理,这次,演示一下使用autossh做反向链接,安装dot:

  1. 从可上网的机器,例如192.168.139.29,建一条链接和外网服务器的链接:

    1
    autossh -M 4001 -NR 3128:192.168.139.29:3128 root@外网服务器

    这样,在外网服务器上,连接127.0.0.1:3128相当于连接到可上网机器192.168.139.29的3128端口,接下来只需在可上网机器192.168.139.29上搭建一个监听3128的http proxy即可,推荐使用3proxy这个软件。

  2. 做好这个后,可在外网服务器用yum安装graphviz:

    1
    2
    3
    export http_proxy="http://127.0.0.1:3128"
    export https_proxy="http://127.0.0.1:3128"
    yum install graphviz

    若是一个个将rpm包下载放到服务器,那是一个很花时间的活,我看了一下,我的服务器上下载graphviz的依赖多达46个。

Profile效果

第一张耗时函数排序图:
webgrind-search

第二张是函数耗时调用关系图:
webgrind-search-call

随意感受下。