Xdebug主动发起连接导致PhpStorm未监听时Nginx超时 如何仅按需启用调试?
- 你当前PHP-FPM的Xdebug配置中
xdebug.connect_timeout_ms被设为0,该参数控制Xdebug尝试连接调试客户端的超时时间,0代表无限等待,因此当PhpStorm未开启调试监听时,请求会一直卡在Xdebug的连接阶段,最终导致Nginx超时。 - 你查询的
php -i是CLI模式的PHP配置,和处理网页请求的FPM模式配置相互独立,前期你误以为的配置不生效是因为只核对了CLI配置,没有检查FPM的实际生效配置。
1. 修复超时问题
编辑/etc/php/7.4/fpm/conf.d/20-xdebug.ini,将xdebug.connect_timeout_ms修改为200,单位为毫秒,即Xdebug最多尝试连接200ms,连不上就自动放弃,不会阻塞正常请求:
xdebug.connect_timeout_ms=200
2. 实现按需开启调试功能
有两种方案可选,根据使用习惯选择即可:
方案A:默认完全关闭Xdebug,调试时临时开启
将所有Xdebug配置文件(含CLI和FPM路径下的ini)中的xdebug.mode设置为off:
xdebug.mode=off
需要调试时再将该值改为debug,执行systemctl restart php7.4-fpm重启PHP-FPM后生效。
方案B:触发器模式,无需改配置随时启用调试
将xdebug.mode设为debug,同时将xdebug.start_with_request设为trigger:
xdebug.mode=debug xdebug.start_with_request=trigger
该模式下普通请求不会触发Xdebug连接,只有当请求携带XDEBUG_SESSION_START=PHPSTORM参数(或浏览器安装Xdebug Helper插件手动触发调试)时,Xdebug才会尝试连接调试客户端,完全不影响正常请求的运行。
3. 清理冗余配置
你当前FPM配置目录下存在两个重复的Xdebug配置文件:xdebug.ini和20-xdebug.ini,其中xdebug.ini中的扩展加载配置已经被注释,属于冗余文件,直接删除即可避免后续配置冲突。
4. 验证配置生效
所有配置修改完成后,执行systemctl restart php7.4-fpm重启PHP-FPM,在网页代码中添加<?php xdebug_info(); ?>查看FPM模式下实际生效的Xdebug配置,确认配置和预期一致即可。
你之前尝试卸载Xdebug后问题仍然存在,是因为只卸载了CLI模式的Xdebug扩展,FPM模式使用的扩展未被移除,完全卸载可执行apt remove php7.4-xdebug,再重启PHP-FPM即可彻底禁用Xdebug。
内容的提问来源于stack exchange,提问作者anonyasd

