使用phpstorm远程连接docker调试xdebug

一、docker中安装xdebug

如果已经有了docker容器,那么在docker的php容器中使用pecl安装xdebug

pecl install xdebug

image

然后使用下列命令开启xdebug扩展

echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/xdebug.ini && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/xdebug.ini && echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/xdebug.ini

开启以后需要重启php-fpm才可以在web端可用,但是直接重启docker的话,刚刚安装的扩展就丢失掉了。
可以使用shell命令来平滑重载php-fpm,这样就不需要重启docker了。

#先查看php-fpm的进程id
ps -ef | grep php-fpm

#然后平滑重载php-fpm
kill -USR2 1

image

到这里xdebug的安装与配置就已经完成了。

如果你的docker容器是最小化镜像没有ps命令,并且你的容器里只有php-fpm一个镜像,那么你的容器里id为1的进程一定是php-fpm,可以直接使用kill -USR2 1重载php-fpm。

如果你的容器中不止有php-fpm一个镜像,那么你需要安装一下ps命令查找一下php-fpm的进程id了。

#更新apt
apt update

#安装ps
apt install -y procps

安装完成后可以写一个简单脚本查看xdebug的默认配置项。

<?php
 xdebug_info();

image

发现xdebug开启成功,但是docker容器没有给它配置端口。

二、xdebug的配置项

xdebug3配置项的key几乎都换了一遍,不过改过以后的新版本要配置的东西更少了,下面列出几个常用选项。请将下列配置写入/usr/local/etc/php/conf.d/xdebug.ini文件,若没有这个文件请使用vi命令添加一份

;xdebug扩展的价值位置
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20210902/xdebug.so
;xdebug扩展的模式需要修改为debug模式才会进入断点调试
xdebug.mode=debug
;是否开启请求监听
xdebug.start_with_request=yes
;监听客户端的地址,host.docker.internal为docker宿主机的地址,我是本地docker环境,docker会自动编译为win的ip地址
xdebug.client_host=host.docker.internal
;监听客户端的端口,xdebug默认为9003
;xdebug.client_port=9003

三、phpstorm配置

phpstorm中使用xdebug需要配置一下本地php解释器,这里的php解释器可以直接使用本地开发环境中的php,但是本地开发环境中也需要按照相同版本的xdebug。
我本地的开发环境就是直接使用的docker,所以这次会把docker镜像配置到phpstorm中作为解释器。

如果你的docker镜像中没有配置xdebug,那么你需要在php的dockerFile中添加以下代码,并更新自己的docker镜像

# 安装xdebug
RUN yes | pecl install xdebug \
    && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/xdebug.ini
(1) phpstorm连接docker

先在phpstorm的file->settings->docker中配置一个链接路径,docker默认的链接端口为2375,注意一定要connection 状态为 successful

image

(2) phpstorm配置php解释器

进入file->settings->php中配置php解释器,这里的server选择刚刚配置的docker,image name选择自己使用的docker镜像,配置完成后记得查看加载完成的镜像中xdebug是否已开启

image

(3)phpstorm配置代码同步

先配置远程调试时的代码同步选项,不配置这个的话远程调试时会一直弹出要你绑定代码同步的提示窗口。

配置mapping的时候第三步deployment path填写的是docker容器中的项目地址,不是项目的挂载地址。

(4) phpstorm配置debug

file->settings->php->debug 这里填写安装xdebug时配置的client_port

image

file->settings->php->debug->dbgp prot 填写项目域名以及端口号
image

(5) phpstorm配置php server

file->settings->php->server 这里使用刚刚配置好的mapping

image

(6) phpstorm配置

先在phpstorm顶栏的调试项中增加一个远程debug的配置
image

然后在配置项中使用ide key ,server选项选择刚刚配置好的php server
image

完成以上配置,再打开phpstorm的监听按钮,就可以开始断点调试了,在postman等请求中加上XDEBUG_SESSION=PHPSTORM选项就会被xdebug监听到了

image

(7) 原理

xdebug的工作流程:客户端使用浏览器通过80端口访问服务端,服务端因为开启了xdebug所以根据配置,将调试信息通过9003端口发送到刚刚配置的docker宿主机地址(docker宿主机就是我们的客户端地址,因为phpstorm运行在windos宿主机上),宿主机上的phpstorm监听到9003端口的响应以后,通过dbpg协议与服务端进行连接,xdebug的每一步进都会响应到phpstorm上,phpstorm在接收到响应后,再通过docker环境里的php解释器,解释请求并显示在我们的编辑界面上

posted @ 2022-10-27 15:32  我也很惆怅  阅读(1778)  评论(0编辑  收藏  举报