Phpstorm + XDebug + Docker + SSH隧道实现远程调试

已经好久没有去动这个blog的代码,准确的说是好多年没搞php,好多年前就觉得nodejs,go等的出现已经使php没有前途了。最近是因为换服务器整理下这个旧博客,而且想可能后面会加进直播流相关的功能,就想着还是稍微弄个开发环境。

不想在本地去部署环境了,就想着直接服务器上调试得了,现在php,nginx等都已经是docker容器部署,远程调试选用XDebug,这个之前的php镜像就已经添加了该拓展。 开发环境是Windows上使用Phpstorm。

这里最大的问题是远程docker容器与本机IDE的通讯问题。
首先,XDebug的原理是:当收到XDEBUG_SESSION_START参数时候开启debug功能,然后XDebug会通过DBGp协议向php.ini配置中指定的IP和端口发送一个请求,而IDE需要监听该端口,接收XDebug的请求,这里就需要XDebug与IDE之间会建立连接,IDE把断点信息发送给XDebug,XDebug收到断点信息后,就知道运行到哪一行时需要停止并把debug数据返回给IDE

所以总体上来说分三步:

  1. IDE开启端口监听,准备接收XDebug信息
  2. PHP配置XDebug开启与往哪个IP端口通讯
  3. 确保PHP与IDE监听端口间的网络连通

如果是同一局域网内,第3步就不需要考虑了。但我现在是IDE在本机,无外网IP映射而PHP是远程服务器的docker容器,所以这里借助其他工具。

刚开始是想用DBGp Proxy 但试用后发现这个代理的作用只是转发,最大作用是实现多用户同时进行XDebug,并不会与内网IDE建立通道,使用过程查看日志可以看到IDE在代理上注册后,代理显示的是本地的外网IP,那么XDebug还是无法穿透到IDE的。

所以第3步只能借助SSH建立隧道来实现

第一步 Phpstorm 开启端口监听,准备接收XDebug信息
2023-04-07T08:09:36.png
这个端口随便设置都可以,其实就是开启监听后会在本地监听该端口
增加一个 的调试配置
2023-04-07T08:39:44.png
Server填写调试网站的URL和设置PHP容器内目录地址与本机代码地址的映射关系。
2023-04-07T08:41:25.png
还可以在Tools->Deployment设置同步目录,方便代码同步

第二步 php.int配置

[xdebug]
xdebug.mode=debug
xdebug.idekey=PHPSTORM
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.start_with_request=yes

这里的端口也可以随便设置,这里要注意的是主机地址,docker容器,设置host.docker.internal,并且在docker-compose.yml中添加

    extra_hosts:
      - host.docker.internal:host-gateway

这里host.docker.internal其实就是宿主机的docker网关,一般是172.17.0.1,也就是XDebug会与宿主机的172.17.0.1:9003进行通讯

第三步 建立SSH隧道
这里要注意的是,远程服务器宿主机的ssh配置要开启GatewayPorts,否则SSH隧道只能转发127.0.0.1:9003的数据。而上面我们PHP容器是发到172.17.0.1:9003 那建立的SSH隧道是不会将其转发到我们本地的,这个地方被坑了好久。

vi /etc/ssh/sshd_config

#GatewayPorts no
GatewayPorts yes

service sshd reload

然后我是通过Xshell去建立SSH隧道,这里注意类型,Remote的端口就是配置在php.intxdebug.client_port,localhost的端口就是配置Phpstorm的XDebug的端口
2023-04-07T08:31:25.png
这样就将远程宿主机的172.17.0.1:9003 <=> 本机的9003 建立通道,Phpstorm就可以愉快的打断点调试了
2023-04-07T08:38:11.png

已有 2 条评论

  1. 新盘 上车集合 留下 我要发发 立马进裙

  2. ?叙事类评语?

添加新评论