访问一个Laravel应用为何会触发另一应用的Xdebug调试连接?
问题根因
- 两个Sail应用的Xdebug默认配置无隔离:Laravel Sail默认将所有容器内的项目根目录映射为
/var/www/html,且Xdebug默认向宿主机host.docker.internal:9003端口发送调试请求,两个应用的调试请求没有专属标识,PhpStorm无法直接区分请求来源。 - PhpStorm无预设服务配置时的匹配逻辑:你当前未配置「PHP | Servers」规则,PhpStorm开启调试监听时,会直接将调试请求携带的容器内文件路径,与当前打开项目的本地路径做匹配。由于两个Laravel项目的容器内文件结构完全一致(比如入口文件路径都是
/var/www/html/public/index.php),当app-b容器发来调试请求时,PhpStorm会错误映射到当前打开的app-a项目的对应文件,触发断点。 - app-a 89端口访问无调试响应的原因:Chrome Xdebug扩展默认仅对已配置的站点开启调试触发,你仅给
localhost:8083配置了调试触发规则,访问localhost:89时Xdebug未被启动,不会向PhpStorm发送调试请求。 - 打开app-b项目时调试正常的原因:此时PhpStorm当前打开的项目路径与app-b容器发来的文件路径匹配正确,映射无误,所以调试符合预期。
修复方案
- 配置独立的PhpStorm服务规则:打开PhpStorm的「PHP | Servers」设置页,分别添加两个应用的配置:
Host填localhost,Port填对应端口(89/8083),勾选「Use path mappings」,将容器内路径/var/www/html映射到对应项目的本地根目录,保存后PhpStorm会根据请求的端口自动匹配正确的路径映射,不会出现串调试的问题。 - (可选)隔离Xdebug请求端口:如果需要同时调试两个项目,可以在其中一个项目的.env文件中添加配置
SAIL_XDEBUG_CONFIG="client_port=9004",重新构建容器后,该项目的Xdebug请求会发送到9004端口,在PhpStorm中配置对应端口的监听即可完全隔离两个应用的调试请求。 - 补充Xdebug扩展触发规则:在Chrome Xdebug扩展的设置中,将
localhost:89添加到允许触发调试的站点列表,确保访问app-a时Xdebug可以正常启动。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

