开发环境win10,phpstorm,调试环境vagrant+homestead+php7.3,xdebug,配置正常,插件正常加载。打印xdebug日志,发现本地能够连通虚拟机,但是xdebug回包的时候,被本地的防火墙拦截了。
xdebug开启远程调试配置,日志的方法
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.max_nesting_level = 512
xdebug.remote_autostart=1
xdebug.remote_log=/tmp/xdebug.log
验证xdebug正常开启的方法,不需要编写php脚本,调用phpinfo()。只需要输入命令:
php -v
看到加载了xdebug模块,还有版本号信息,就是正常的。
而查看具体的xdebug配置可以输入以下命令
php -i|grep xdebug
把xdebug模块的信息过滤后,会输出一堆关于xdebug的配置,这里只截取重点配置
当我使用chrome,开启xdebug调试插件,访问虚拟机web端口的时候,xdebug日志输出如下:
因为是内网环境,所以200ms已经足以判断超时。不放心可以再用curl进行验证
curl 172.17.7.49:9000
会一直卡着直到超时异常。确认是本地防火墙问题,之后自然想到会配置Windows Defender。但是问题又来了。当我添加了一条入站规则
再打开win10防火墙日志(这方法win10通用),然后打开PowerShell输入命令
//防火墙默认的日志输出路径C:\WINDOWS\system32\LogFiles\Firewall\pfirewall.log
//-Tail 类似linux bash tail,输出最近30行内容,-Wait 表示1秒刷新一次日志,近似-f,组合起来类似于tail -f
Get-Item -Path C:\WINDOWS\system32\LogFiles\Firewall\pfirewall.log|Get-Content -Tail 30 -Wait
查看被丢弃的数据包
能看到我虚拟机发到9000端口的数据包被DROP掉了。但是我关闭防火墙,又确实可以正常断点,所以肯定就是防火墙的配置问题。我又从网上搜索了入站规则无法生效的问题,涉及到作用域,我看了一下,任何IP来源,配置文件所有地方生效,顺带一提(我这个触发的是公有配置,明明网络是专有网络)。我突然又想到,也许是以前某些入站规则的配置,覆盖了我现在这一条配置。于是我首先查找,有没有关于phpstorm的配置,因为我使用的就是phpstorm首先要排除是IDE配置的原因。果不其然按照名称排列,找到了phpstorm一堆禁用任何端口的入站规则,之所以是一堆,是因为我升级比较频繁,所以还有旧版本的入站规则,
我不明白为什么会有这些入站配置,但是立马先把这些规则删除了,然后端口立马通了,断点调试正常了。我排除了自己使用IDE过程中,主动增加的这些规则,我甚至还能看到Pycharm也做了类似的默认配置,所以有理由确定是jb出于安全策略生成了这些默认配置。
嘛,反正问题到此为止算是解决了,希望能帮助看到这篇博客的朋友,首先确认xdebug扩展是否正常加载,配置是否正确,两边防火墙是否做了限制。一步步排查,问题就迎刃而解了。