VirtualBox虚拟机中XDebug端口9000占用的VS Code调试配置问题
解决XDebug端口冲突(EADDRINUSE :::9000)的问题
这个坑我之前踩过!核心原因有两个:一是你搞混了XDebug的连接方向,二是9000端口是PHP-FPM的默认端口,你的虚拟机里的PHP-FPM正占着这个端口,所以VS Code没法监听。
先搞清楚XDebug的工作逻辑
XDebug是虚拟机里的PHP进程作为客户端,主动连接你的本地VS Code(调试服务器),而不是VS Code去连接虚拟机的端口。所以你不需要让VS Code去监听虚拟机的9000,反而要让虚拟机里的XDebug主动连到你本地的端口。
步骤1:修正虚拟机里的XDebug配置
找到你虚拟机里的XDebug配置文件(一般是/etc/php/[version]/mods-available/xdebug.ini或者类似路径),确保配置如下:
xdebug.mode = debug xdebug.client_host = 你的宿主机IP # 比如VirtualBox宿主机的内网IP,通常是192.168.56.1 xdebug.client_port = 9003 # 避开PHP-FPM的9000端口 xdebug.start_with_request = yes xdebug.idekey = VSCODE
怎么找宿主机IP?在虚拟机里ping
host.docker.internal(如果是VirtualBox,也可以看网络设置里的宿主机网卡IP,比如192.168.56.1)
步骤2:更新VS Code的launch.json
把端口改成和XDebug配置一致的9003,同时加上路径映射(不然断点会找不到本地文件):
{ "version": "0.2.0", "configurations": [ { "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9003, // 这里改成9003 "pathMappings": { // 把虚拟机里的项目路径映射到本地的项目路径 "/var/www/html": "${workspaceFolder}" } }, { "name": "Launch currently open script", "type": "php", "request": "launch", "program": "${file}", "cwd": "${fileDirname}", "port": 9003, "pathMappings": { "/var/www/html": "${workspaceFolder}" } } ] }
步骤3:重启服务并验证
- 在虚拟机里重启PHP-FPM和Web服务器(比如
systemctl restart php8.2-fpm nginx,根据你的PHP版本和Web服务调整) - 在VS Code里点击"Start Debugging: Listen for XDebug",现在不会再提示端口占用了
- 在浏览器访问虚拟机里的Symfony应用,或者在CLI里运行脚本,VS Code应该会自动触发断点
为什么之前会出错?
你的虚拟机里的PHP-FPM默认监听9000端口,所以当VS Code尝试监听同一个端口时,就会出现EADDRINUSE错误。XDebug 3.x版本把默认端口改成9003就是为了避开这个冲突,所以用9003就不会和PHP-FPM抢端口了。
内容的提问来源于stack exchange,提问作者Enrique Moreno Tent




