Xdebug 与 PHPStorm 应该是学 PHP 的同学们都熟知的两款工具,用 PHPStorm 可以方便地与 Xdebug 拓展进行通信,进行 PHP 代码的调试、优化。

Xdebug 下载安装

版本选择

首先下载 PHPStorm 与 Xdebug,注意他们两者的发布时间,最好是 Xdebug 版本的发布时间早于 PHPStorm 对应版本的时间,不然可能会有一些奇怪的问题。 比如,我的 PHPStorm 是 2019.2 版本的,那么我选择 Xdebug 就最好选择这个时间之前发布的,比如 Xdebug 2.6.1(2018 年 9 月发布的)。其实也很好理解,比 Xdebug 版本更新的 PHPStorm 才能完全兼容 Xdebug,向下兼容。

安装

下载 Xdebug,并编译安装。 当运行php -m后能在Zend Modules节中看到 Xdebug,说明插件安装成功,例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
> php -m

[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
···
yaf
zip
zlib

[Zend Modules]
Xdebug

编辑 Xdebug 配置

输入php --ini``,找到 xdebug 的配置文件路径 图片 如果没有找到 xdebug 单独的配置文件,八成 xdebug 的配置写在php.ini`中。

Xdebug 的几种功能

  • Debug: 代码调试。
  • Profiler: 性能分析。
  • Trace: 代码跟踪,了解代码的执行轨迹。

本文主要介绍DebugProfiler两种功能。

Debug 模式配置

使用 Debug 模式,可以进行代码的单步调试。打断点,让代码运行到某个位置,并能查看此时调用栈、变量等信息,比echoprintvar_dump等调试方法方便不少。

remote_autostart

是否自动开启调试,一般填0,即不自动开启调试。如果自动开启调试的话,每个 PHP 请求都会进入调试模式,使用起来不够方便。

remote_enable

是否开启调试。只有当这个配置的值为1的时候,才能进行 Xdebug 调试。因此这个值填写1

remote_port

Xdebug 的通信端口,IDE 将通过此端口与 Xdebug 进行通信。默认值为9000,但会与 PHP-FPM 的默认端口冲突,因此我把该值设置为9001

remmte_hander

Xdebug 通信协议类型,一般写为dbgp

idekey

调试密钥,后面在 PHPStorm 中会配置此项。

PHPstorm 配置

打开 PHPStorm 的配置页面(菜单的 Preference 选项),选择 Language & Frameworks 下的 PHP,然后如图进行配置。

首先配置 Debug 菜单下的 Xdebug 配置项Debug Port写Xdebug 配置文件中remote_port的值。 Debug 菜单配置

配置 DBGP 相关信息,IDE Key 同 Xdebug 配置中的 idekey 配置项。 DBGp Proxy 菜单配置

至此,PHPStorm 的 Debug 环境就配置完了,就可以使用 PHPStom 的单步调试功能了。

Profiler 模式配置

Xdebug 也为我们提供了方便的性能分析功能,使用该功能,能方便得看到各函数的调用情况、执行时间等信息,从而找出代码瓶颈,方便优化代码。

profiler_enable

是否启用 Profiler,启用之后,每次运行 PHP 脚本都会进行性能分析,因此一般建议关闭此功能。

profiler_enable_trigger

是否启用 Profiler 触发器。一般填1,即启用。

profiler_enable_trigger_value

Profiler 触发器的触发值。只有当profiler_enable_trigger开启且调试时传入的触发值等profiler_enable_trigger_value的值时,Xdebug 才会启动性能分析。

profiler_output_dir

分析结果文件输出的目录。Profiler 分析的结果是输出到文件的,因此需要指定文件存放的目录。

profiler_output_name

分析结果输出文件名,有多种格式,具体可参考相关文档

如何使用 PHPstorm 分析 Profiler 文件

使用 Xdebug 生成的 Profiler 文件内容繁杂,不易于直接进行分析,一般使用工具对其进行分析,从而得到易于阅读的分析结果。市面上有不少类似的分析软件,安装起来比较麻烦。其实,PHPStorm 就有自带的类似工具,也基本能满足需求。 在 PHPStorm 的菜单中选择 Tools 下的 Analyze Xdebug Profiler Snapshot,如图

选择Xdebug 生成的 Profiler 文件后,就看到下图的分析结果。 在Call Tree中可以看到各个方法的运行时间以及时间占比。在Call Tree中选择某个方法,然后在下方的Callees中可以看到该方法调用了哪些方法,而在Callers中可看到该方法被哪些方法调用。

PHPStorm Profiler 分析工具

贴出我自己的 Xdebug 完整配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[XDebug]
zend_extension="/usr/local/lib/php/pecl/20170718/xdebug.so"

xdebug.overload_var_dump = 0
xdebug.default_enable = 0

xdebug.remote_enable = 1
xdebug.remote_port = 9001
xdebug.remote_hander = "dbgp"
xdebug.idekey = "PHPSTORM"
xdebug.remote_log = "/tmp/xdebug-remote.log"

xdebug.profiler_enable_trigger = 1
xdebug.profiler_enable_trigger_value = "PROFILER_TRIGGER"
xdebug.profiler_output_dir = /tmp
xdebug.profiler_output_name = "xdebug.profiler.%R"

Xdebug 其它参数项说明

与 Postman 交互

Postman 是一款出色的接口调试软件,它也能通过 Xdebug 与 PHPStorm 进行单步调试。 打开 Postman,配合好要调试的接口,然后在要调试的接口中配置 Header,添加一个 Header,keyCookievalueXDEBUG_SESSION=PHPSTORM,即之前在 Xdebug 中配置的的idekey值。然后在 PHPStom 中打断点,就可以体验到 Postman 与 PHPStom 交互调试了。 同样的,添加一个 Header,keyCookievalueXDEBUG_PROFILE=PROFILER_TRIGGER,即 Xdebug 中设置的profiler_enable_trigger_value值,就可以进行接口的性能分析,分析结果以文件形式输出到 Xdebug 配置中指定的目录。

Postman 配置

参考文献

Xdebug 官方文档