likes
comments
collection
share

vscode+xdebug实现远程调试PHP项目代码

作者站长头像
站长
· 阅读数 39

本文来由

由于近段时间难得空闲,打算研究学习优秀的框架源码。 想着通过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,可选值有yesno,此处必须为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

vscode+xdebug实现远程调试PHP项目代码

如图所示,按顺序点击,即可创建调试配置文件。初始配置长这样:

vscode+xdebug实现远程调试PHP项目代码

把上图框起来的配置:

{
  "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个重要配置:portpathMappingshostname

port

接收调试数据包的本地端口。 根据前述,如果远程代码在公网服务器,此处应填写端口转发的实际端口。 远程代码在内网虚拟机,则填写php.ini中,xdebug.client_port设置的端口。

pathMappings

远程代码的项目根目录,到工作区目录的映射设置。 格式是:A路径 : 工作区路径 若是远程目录有变化,修改A路径即可。(A路径必须是绝对路径)

hostname

接收调试数据包的地址。 此处设置为VS Code所在机器的内网IP地址。

调试实测

此处用 chrome 浏览器和 ThinkPHP 5.0.26 初始框架作为演练。 如图按步骤激活Xdebug helper浏览器拓展,成功激活会变色。

vscode+xdebug实现远程调试PHP项目代码 vscode+xdebug实现远程调试PHP项目代码

在VS Code的调试功能界面,选择第一项,即:远程调试,点击绿箭头激活调试功能。

vscode+xdebug实现远程调试PHP项目代码

此处打开了thinkphp框架入口文件,对首行做了打点。

vscode+xdebug实现远程调试PHP项目代码

转到浏览器访问thinkphp首页,可以看到页面显示一直在加载中, VS Code已经停在了打点处,调试界面显示收集到的变量和调用堆栈等调试信息, 测试成功。

vscode+xdebug实现远程调试PHP项目代码

终于可以愉快地玩耍了φ(゜▽゜*)♪

写在最后

本文如有谬误,跟随本文实操还是有错误之处,欢迎指教和反馈。

转载自:https://juejin.cn/post/7201509055713493049
评论
请登录