在工作中我们不得不关注的一点就是程序的执行性能,但是面对日益复杂的程序,单纯靠人工code review去分析性能瓶颈,显然不是那么有效率的事情,因此找到合适的工具用来分析性能消耗变得尤为重要,这次就来介绍下PHP性能分析工具XDEBUG。

XDEBUG

官网:https://xdebug.org/

XDEBUG是历史悠久的PHP扩展之一,用于DEBUG和分析PHP程序,该项目一直有在维护,目前支持PHP5到7的版本,基本上涵盖了我们常用版本。

安装XDEBUG

官方文档:https://xdebug.org/docs/install

基本上跟安装其他扩展没有什么区别,下载源码后用phpize + configure + make && make install 即可。

需要注意的是如果安装了多个PHP版本,那么在configure的时候要带上指定版本的php-config可执行文件。

配置XDEBUG

官方文档:https://xdebug.org/docs/all_settings

XDEBUG并不只有profiler功能,因此它有非常多的配置选项,包括函数trace,GC监控等等,本文由于主要将性能分析所以只启用profiler功能,在php.ini中添加以下几行配置:

zend_extension=/pathToExtension/xdebug.so
xdebug.profiler_enable=0
xdebug.profiler_enable_trigger=1 xdebug.profiler_output_dir=/apps/xdebug

xdebug.profiler_enable参数为1时默认对所有请求都采集性能数据,这里我们设置为0,也就是默认不采集。

xdebug.profiler_enable_trigger参数为1时,仅在GET/POST/COOKIE参数中带有XDEBUG_PROFILE时才采集。

配置好以后,重启PHPFPM,通过HTTP或者其他手段访问PHPFPM进程,就会在配置的xdebug.profiler_output_dir目录下找到类似 cachegrind.out.6191 的文件了,文件后面的数字是进程PID。

注意:如果需要跟OPCACHE共用的话,则要在OPCACHE加载后再加载XDEBUG,具体可以查阅官方文档。

分析结果

XDEBUG采用了Cachegrind格式来记录分析结果,该文件格式可以用kcachegrind工具来生成可视化分析视图,除此以外XDEBUG作者还提供了几种不同的分析工具,不过我这边看了下那些工具都不是那么好使,google后发现PHPSTORM也支持XDEBUG的分析结果文件,因此就直接使用PHPSTORM来进行分析。

需要注意的是XDEBUG不同版本的分析结果对PHPSTORM版本也是有要求的,我用XDEBUG 2.8输出的分析结果,用PHPSTORM 2016版无法解析,用PHPSTORM 2019版就可以解析成功,各位如果解析不成功的话,可以尝试更换不同版本的XDEBUG或PHPSTORM。

打开PHPSTORM,菜单上选择Tools,选择Analyze Xdebug Profiler Snapshot,再选择我们之前采集的文件,即可看到可视化的性能分析报告。

如下图所示:

undefined

点击右边的TAB还能以树状来显示(当然像lavaral这样的套娃框架,用树状来分析显然不是一个好主意…)

undefined

在分析报告中,我们可以看到是哪些函数耗时或者消耗的内存较多,进而找到可优化的地方。

当然由于Xdebug的profiling功能还是存在一些局限性,比如只能统计执行时间和内存消耗,无法知道CPU消耗。

如果需要知道更加详细的数据,那就只能用更强大的工具Tideway了。

所以下次文章会介绍如何使用tideway来搭建一套生产可用的性能监控系统。