背景
已经通过docker容器启动了一个web服务,并在宿主机可以访问http://localhost:8080访问网页。
现在想使用phpstorm打断点调试代码。
方法
1. 容器内安装xdebug
进入容器
docker exec -it <container-name> bash
为php安装xdebug拓展
apt install php8.1-xdebug
查一下配置文件的路径,并编辑其内容
php --ini|grep xdebug
# 输出路径信息如下(注意末尾多了个逗号)
# /etc/php/8.1/cli/conf.d/20-xdebug.ini,
编辑xdebug配置文件vim /etc/php/8.1/cli/conf.d/20-xdebug.ini
,并输入必要的配置项:
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.idekey = "phpstorm"
重启fpm使配置生效
service php8.1-fpm restart
到这里,容器内的web服务已经支持调试了,等着客户端跟它通信。
另外,php文件中可以调用xdebug_info()
查看xdebug的配置信息。
2. PhpStorm配置调试环境
2.1 配置php解释器
点击确定后,选中这个解释器,并保存设置。
2.2. 配置被调试代码所在的服务器
2.3 开始调试
随后点击调试按钮(小瓢虫)即可监听调试。打个断点,发个请求试试。
3. 效果
4. 原理
xdebug的工作流程:客户端使用浏览器通过80端口访问服务端,服务端因为开启了xdebug所以根据配置,将调试信息通过9003端口发送到刚刚配置的docker宿主机地址(docker宿主机就是我们的客户端地址,因为phpstorm运行在windos宿主机上),宿主机上的phpstorm监听到9003端口的响应以后,通过dbpg协议与服务端进行连接,xdebug的每一步进都会响应到phpstorm上,phpstorm在接收到响应后,再通过docker环境里的php解释器,解释请求并显示在我们的编辑界面上。