vscode+xdebug实现远程调试PHP项目代码
本文来由
由于近段时间难得空闲,打算研究学习优秀的框架源码。 想着通过VS Code调试框架源码,观察框架执行流程,就想到了著名的XDebug。 XDebug本身支持远程调试,就先把框架源码丢一份到虚拟机,再面向搜索引擎解决配置问题。 然后发现网上的文章大多说得不够准确,看得云里雾里的,跟着实操时发现很多坑。 故留下本文作为记录,希望能帮到后来者。
需要搞明白的
网络文章很多没说明白的点, Xdebug远程调试基本原理,是通过定制的网络协议, 对外访问特定的机器,询问里面的IDE有没有打点等调试请求, 如有就把调试信息拿回来服务器执行调试, 执行结果又会通知IDE,之后就等待IDE下一步调试,如此往复。 所以Xdebug需要在远程代码所在机器的PHP配置中,设置IDE所在地址和端口, IDE所在机器不需要安装XDebug,但是要开放配置约定的端口。
准备工作
阅读下文前,请读者先安装好以下内容:
- 远程机器
- php 7.x/8.x
- php_xdebug拓展,版本号是3.x
- nginx
- 本地系统
- VS Code编辑器,已安装PHP Debug拓展
- chrome/firefox浏览器,在拓展商店搜索并安装官方插件「Xdebug helper」
上述工具的安装就不在这赘述了。
配置步骤详解
1. php_xdebug拓展
在php.ini末尾,添加以下必要内容:
xdebug.mode = debug,develop,trace
xdebug.start_with_request = yes
xdebug.client_host = 192.168.1.10
xdebug.client_port = 9003
以下解释每一条的作用:
xdebug.mode
[官方文档]
XDebug3.x的新配置,用于指定可用的调试模式,支持英文逗号拼接多种模式。至少需要添加
trace
模式。而我的例子用了debug,develop,trace
。
xdebug.start_with_request
[官方文档]
XDebug3.x的新配置,控制是否激活函数追踪、步进调试等功能。用于替代
xdebug.remote_autostart
,可选值有yes
、no
,此处必须为yes
。
xdebug.client_host
[官方文档]
XDebug3.x的新配置,用于指定将调试数据包发送到哪个地址。此处有2种情况:
- 远程代码在同一内网的虚拟机时,这里设置为VS Code所在机器的内网IP地址。
- 远程代码在公网的VPS时,这里也2种情况:
- 本地有做DDNS域名解析的,设置为该DDNS域名。并在路由器添加好转发设置,转发到VS Code所在机器的内网IP地址。
- 本地使用内网穿透到公网服务器的,设置为该服务器的地址/域名。并在穿透工具的配置中,添加相关转发配置,转发到VS Code所在机器的内网IP地址。
本配置用于替代
xdebug.remote_host
。
xdebug.client_port
[官方文档]
XDebug3.x的新配置,用于指定将调试数据包发送到哪个端口。可选值1-65535,VS Code所在机器没用被占用的端口都可以设置。不过一般设置为9003。 用内网穿透工具的要配置好端口转发。用DDNS域名解析的,在路由器做好端口转发。 另外提一句,由于有端口转发,此处设置的端口,和实际到达本地的端口可以不一样。 本配置用于替代
xdebug.remote_host
。
2. PHP-FPM与NGINX
常规情况下,PHP请求时间一般设置在30-300秒。在调试时,这个时间远远不够,很容易导致调试过程中,服务器返回502、504的超时状态,妨碍调试。 所以要修改远程机器的php-fpm、nginx的配置,延长超时触发时间。
2.1. NGINX
找到php-fpm配置文件nginx.conf
,若发现文件中出现以下配置任意之一,统一改为7200或更多。没有出现的配置不用理会,也无需手动添加到配置文件中:
- fastcgi_connect_timeout
- fastcgi_send_timeout
- fastcgi_read_timeout
- proxy_connect_timeout
- proxy_send_timeout
这些配置的单位均为秒。
2.2. PHP-FPM
找到php-fpm配置文件php-fpm.conf
,一般是和php.ini
放在一起。在php-fpm.conf
里,找到配置
- request_terminate_timeout
修改为7200或更多,该配置的单位为秒。
注意:不可超过上面
2.1.
中,在NGINX设置的超时时间,否则NGINX就优先触发504超时。
3. VS Code
如图所示,按顺序点击,即可创建调试配置文件。初始配置长这样:
把上图框起来的配置:
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
}
改成这样:
{
"name": "远程调试",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/www/wwwroot/thinkphp5/": "${workspaceFolder}/"
},
"hostname": "192.168.1.10"
}
此处有3个重要配置:port
、pathMappings
、hostname
port
接收调试数据包的本地端口。 根据前述,如果远程代码在公网服务器,此处应填写端口转发的实际端口。 远程代码在内网虚拟机,则填写
php.ini
中,xdebug.client_port
设置的端口。
pathMappings
远程代码的项目根目录,到工作区目录的映射设置。 格式是:A路径 : 工作区路径 若是远程目录有变化,修改A路径即可。(A路径必须是绝对路径)
hostname
接收调试数据包的地址。 此处设置为VS Code所在机器的内网IP地址。
调试实测
此处用 chrome 浏览器和 ThinkPHP 5.0.26 初始框架作为演练。
如图按步骤激活Xdebug helper
浏览器拓展,成功激活会变色。
在VS Code的调试功能界面,选择第一项,即:远程调试,点击绿箭头激活调试功能。
此处打开了thinkphp框架入口文件,对首行做了打点。
转到浏览器访问thinkphp首页,可以看到页面显示一直在加载中, VS Code已经停在了打点处,调试界面显示收集到的变量和调用堆栈等调试信息, 测试成功。
终于可以愉快地玩耍了φ(゜▽゜*)♪
写在最后
本文如有谬误,跟随本文实操还是有错误之处,欢迎指教和反馈。
转载自:https://juejin.cn/post/7201509055713493049