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
所以总体上来说分三步:
- IDE开启端口监听,准备接收XDebug信息
- PHP配置XDebug开启与往哪个IP端口通讯
- 确保PHP与IDE监听端口间的网络连通
如果是同一局域网内,第3步就不需要考虑了。但我现在是IDE在本机,无外网IP映射而PHP是远程服务器的docker容器,所以这里借助其他工具。
刚开始是想用DBGp Proxy
但试用后发现这个代理的作用只是转发,最大作用是实现多用户同时进行XDebug,并不会与内网IDE建立通道,使用过程查看日志可以看到IDE在代理上注册后,代理显示的是本地的外网IP,那么XDebug还是无法穿透到IDE的。
所以第3步只能借助SSH建立隧道来实现
第一步 Phpstorm 开启端口监听,准备接收XDebug信息
这个端口随便设置都可以,其实就是开启监听后会在本地监听该端口
增加一个 的调试配置
Server填写调试网站的URL和设置PHP容器内目录地址与本机代码地址的映射关系。
还可以在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.int
的xdebug.client_port
,localhost的端口就是配置Phpstorm的XDebug的端口
这样就将远程宿主机的172.17.0.1:9003
<=> 本机的9003 建立通道,Phpstorm就可以愉快的打断点调试了
新盘 上车集合 留下 我要发发 立马进裙
?叙事类评语?