xDebug 使用指南

1 本机的 xdebug 配置

1.1 xdebug 的安装

可以使用 php -v 命令查看是否已经安装了 xdebug

如果没有安装,可以参考 Xdebug 官方文档进行安装。

然后我们需要用php --ini查看配置文件路径,然后在 php.ini 文件中配置以下内容:

1
2
3
4
5
6
7
8
9
[XDebug]
zend_extension="xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9001
xdebug.remote_autostart=1
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"
xdebug.idekey=PHPSTORM

1.2 PhpStorm 的配置

php 在处理 web 请求时都是通过 Nginx 将请求转发给 fpm,当我们在本地进行简短的代码调试时,再起一个 Nginx 服务就显得有些笨重了,好在自 PHP 5.4.0 起,CLI SAPI 提供了一个内置的 Web 服务器,这样,我们本地调试 web 请求时只需启动 fpm 即可。

首先,我们要在图示位置设定好 PHP 解释器

然后,修改 debug 监听端口为 9001

设置 DBGp 代理,注意需和 debug 配置中的一致

设置监听服务器

1.3 调试

需要注意的是,调试分为 cli 与 web 两种模式,仅在 debug web 请求时才需要开启 ,cli 模式下的调试无需开启

1.3.1 cli 下的调试

1.3.2 web 下的调试

在代码中设置好断点后,开启,然后浏览器访问 http://localhost:8000/debug.php ,即可在 IDE 中获取断点信息

2 Docker 环境下的 xdebug 配置

2.1 配置 Laradock

2.1.1 修改 laradock/.env

打开 .env 文件,修改下列配置项:

1
2
WORKSPACE_INSTALL_XDEBUG=true
PHP_FPM_INSTALL_XDEBUG=true

2.1.2 配置laradock/php-fpm/xdebug.ini

php-fpm 用于调试 php 的服务器模式,基于浏览器请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

; phpstorm [文档](https://www.jetbrains.com/help/phpstorm/2020.1/configuring-xdebug.html?utm_campaign=PS&utm_content=2020.1&utm_medium=link&utm_source=product#configuring-xdebug-docker)中提到,在 docker 中使用`host.docker.internal`会自动解析为内网地址,无需更改为`docker.for.win.localhost`或`docker.for.mac.localhost`
xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
; 修改默认端口号 9000 为 9001,9000 与 php-fpm 端口号冲突
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM

; 开启
xdebug.remote_autostart=1
; 开启
xdebug.remote_enable=1
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1

2.1.3 配置 laradock/workspace/xdebug.ini

workspace 用于调试 php 的命令行模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM

xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1

2.1.4 重新构建 php-fpm 和 workspace 容器

1
$ docker-compose build --no-cache php-fpm workspace

2.1.5 重新启动容器

1
$ docker-compose up -d workspace

2.1.6 查看 xdebug 是否安装成功

方式一

workspace 容器中查看

方式二

laradock 根目录查看 xdebug 状态

2.1.7 xdebug 状态管理

在 laradock 根目录执行以下命令管理 xdebug,安装成功默认已启动

1
$ ./php-fpm/xdebug start/stop/status

2.1.8 确认 xdebug 配置变更在容器中生效

2.2 配置 PhpStorm

2.2.1 配置 debug

打开 Preferences > Languages & Frameworks > PHP

2.2.2 配置 DBGp Proxy

打开 Preferences > Languages & Frameworks > PHP > Debug > DBGp Proxy

此处的IDE key配置需与xdebug.idekey一致

2.2.3 验证配置

填写校验脚本地址时,需是项目根目录,如 laravel 是 public 目录。

2.2.4 添加服务器

打开 Preferences > Languages & Frameworks > PHP > Server

由于项目是在容器中运行的,因此需要配置项目宿主机路径与容器路径的映射关系。

此处可配置多个服务器,适用于多个项目间的切换。

2.2.5 设置 debug

由于是在容器中运行的,所以需要选择 PHP Remote Debug

2.3 开始 debug

总结

善用 xdebug,不仅能摆脱var_dump()的原始断点调试,提升我们的工作效率,也能很好的追踪代码的调用,在排查故障与学习优秀框架时能事半功倍。

参考资料

  1. Laradock 配置 xdebug 与 phpstorm
  2. 推荐代码调试工具 Xdebug
  3. 在 Laradock 中使用 Xdebug
  4. Laradock 使用 PhpStorm Debug 代码
  5. 如何查看 LINUX 发行版的名称及其版本号
  6. 基于 Xdebug 进行代码调试
因为热爱,所以执着。