php容器远程调试指北

部署说明

本机windows,服务器Ubuntu,服务器上跑一个php docker容器,本机使用IDE PhpStorm,需要服务器可以通过ip访问到本机。

本文以一个thinkphp应用为例,本机和服务器上各有一份代码。

容器:

1
docker run -it -p 8000:8000 -p 9003:9003 -v .:/think php:8 /bin/bash

8000是web端口,9003是调试端口

调试配置

容器内安装Xdebug

1
2
pecl install xdebug
docker-php-ext-enable xdebug

xdebug安装成功时会回显xdebug.so的路径,待会要写到配置文件里。

创建配置文件

1
2
apt update && apt install -y vim
vim /usr/local/etc/php/conf.d/xdebug.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20230831/xdebug.so
xdebug.idekey=PHPSTORM
; 进行调试所需要携带的IDEKEY
xdebug.discover_client_host = Off
xdebug.client_host="10.0.0.3"
; 这里是物理机,即IDE所在机器的ip
xdebug.mode=profile,trace,debug
xdebug.start_with_request=yes
xdebug.client_port = 9003
xdebug.remote_handler = dbgp
xdebug.log = /tmp/xdebug.log
xdebug.remote_enable=1
xdebug.remote_port = 9003

IDE配置

Settings -> PHP,首先为你的IDE添加一个可用的php解释器,我这里直接用了服务器上的,版本没有严格要求,差不太多就行

然后添加一个服务器,端口是web的端口,添加文件路径映射

PHP -> 调试,确认一下调试端口是否正确

PHP -> 调试 -> DBGp代理,填一下IDEKEY和服务器的ip-port,与调试端口一致

最后添加一个PHP远程调试配置,服务器选择之前在设置里添加过的,然后填写IDEKEY

开始debug

IDE里下个断点,用刚才的配置开始调试

到web根目录把服务跑起来:

1
php think run

浏览器发一个能使代码运行到断点处的请求

1
http://10.0.0.7:8000/Lilac/de?data=aaaa

就能看到断下来了:

失败处理

遇到过一些很抽象的问题......总之如果断不下来,可以尝试如下思路:

重启服务

IDE重新开启调试,以及重启web服务,两边都试试,并且可能受到重启的次序的影响

添加参数

请求里加个get参数:XDEBUG_SESSION_START=PHPSTORM

P.S. 搜索到的文章都写到了这一点,但事实上似乎没加也能断。

如果确定是这个问题,那么你可以安装一个叫Xdebug Helper的浏览器插件,它可以帮你自动化完成这个操作,不需要每次手动加。