You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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:重启服务并验证

  1. 在虚拟机里重启PHP-FPM和Web服务器(比如systemctl restart php8.2-fpm nginx,根据你的PHP版本和Web服务调整)
  2. 在VS Code里点击"Start Debugging: Listen for XDebug",现在不会再提示端口占用了
  3. 在浏览器访问虚拟机里的Symfony应用,或者在CLI里运行脚本,VS Code应该会自动触发断点

为什么之前会出错?

你的虚拟机里的PHP-FPM默认监听9000端口,所以当VS Code尝试监听同一个端口时,就会出现EADDRINUSE错误。XDebug 3.x版本把默认端口改成9003就是为了避开这个冲突,所以用9003就不会和PHP-FPM抢端口了。

内容的提问来源于stack exchange,提问作者Enrique Moreno Tent

火山引擎 最新活动