PHP调试用到xdebug插件作为调试服务。在筋斗云开发环境中默认已包含xdebug并已开启(在php.ini有相关配置)。 xdebug 2.x版本配置项(默认端口9000):
[xdebug]
xdebug.remote_enable=1
xdebug 3.x版本配置项(默认端口9003,这里和之前一致改为9000了):
[xdebug]
xdebug.mode=debug
xdebug.client_port=9000
服务端检查xdebug是否安装:php -m
中查看是否有Xdebug. 如果没有安装,可用yum/apt搜索xdebug包(一般名为php-xdebug或php-pecl-xdebug)。 在centos7/ubuntu20中xdebug均默认是2.x版本。
调试器(调试客户端)可以使用vscode,点左侧“扩展”图标,找到并安装PHP Debug插件(或推荐的PHP插件,也支持调试)。打开项目目录中的PHP文件,设置断点。 按F5开始调试,第一次调试时,它要求设置launch.json
文件。打开它配置一下端口,使用9000:
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9000
}
注意:vscode支持远程开发调试。配置好后可直接连接生产环境调试。
前端也必须激活调试才可以,其原理是在URL中添加XDEBUG_SESSION_START=1
参数(或是在cookie中添加)。
方法一:在打开Web应用后,在F12的网络监测中随便找一个xhr请求,双击打开,在URL参数后添加&XDEBUG_SESSION_START=1
,比如 http://localhost/jdcloud/server/api.php/Employee.query?xp=xxxxx&XDEBUG_SESSION_START=1
只需设置一次,在关闭浏览器前都可一直调试(因为会在cookie中记录XDEBUG_SESSION=1)。
方法二:chrome安装PHP Debug扩展,在要调试时激活它。(google的服务器不太好访问,导致chrome扩展安装需要fanqiang)。像这样:
然后就可以看断点是否命中了。
除了vscode,调试器还可以使用netbean等集成工具; 如果使用Vim,可以用Vdebug插件,我做了一些修改以适配vs的快捷键:vdebug-lj-1.4.2.vmb。调试如下:
Apache中应设置fastcgi调用php合理的超时时间,否则一调试没多久连接就中断了, 找到D:\Apache24-x64-vc15\conf\__user.conf
(根据你的安装路径来找),修改factcgi相关选项:
#最大执行时间 改10分钟吧(默认约2分钟)
FcgidIOTimeout 600
FcgidIdleTimeout 600
然后重启Apache生效。
调试服务器上apache+php代码技巧:
ssh myserver -R9000:localhost:9000
注意:虽然vscode支持强大的remote-ssh调试功能,可直接远程连接到服务器上修改和调试文件。 但它会在服务器上自动安装vscode server,内存消耗较大,可能导致服务器死机,不建议使用!