【问题标题】:Issues when Debugging PHP in VSCode using Docker and WSL2使用 Docker 和 WSL2 在 VSCode 中调试 PHP 时的问题
【发布时间】:2020-09-18 02:23:43
【问题描述】:

我已经在 Windows 中使用 VSCode + Docker 几年了,并且设法拥有一个完全正常工作的开发环境,没有任何问题。

最近我用 WSL2 设置了一个新的开发环境。将我所有的项目、库、CLI 等移动到 WSL 中,使用带有 WSL2 容器的 Docker Windows 和带有远程连接到 WSL 的 Windows 上的 VSCode。一切都很顺利,我喜欢我可以将所有东西分开。

但最近我遇到了一个我无法解决的问题,我失去了调试 PHP 文件的能力。 我正在使用 VSCode Remote WSL 扩展来处理我在 WSL 中的项目,但是当我尝试调试时,没有任何反应。

对于我使用的每个开发环境(Windows、MacOS 和 WSL),我的 VSCode 中都有树调试设置。除了 WSL 之外的所有工作。当我尝试使用 WSL 进行调试时,实际上什么都没有发生,没有输出错误,没有调试控制台信息,什么都没有……

这是我的 VSCode 调试设置:

{
    "version": "0.2.0",
    "configurations": [{
            "name": "Listen for XDebug Win10",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings": {
                "/var/www/project-a/api": "\\\\wsl$\\Ubuntu\\home\\ubuntu\\PROJECTS\\project-a\\api",
            },
            "ignore": [
                "**/vendor/**/*.php"
            ]
        },
        {
            "name": "Listen for XDebug MacOS",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings": {
                "/var/www/project-a/api": "/Users/ricky/PROJECTS/project-a/api",
            },
            "ignore": [
                "**/vendor/**/*.php"
            ]
        },
        {
            "name": "Listen for XDebug WSL",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings": {
                "/var/www/project-a/api": "/home/ubuntu/PROJECTS/project-a/api",
            },
            "ignore": [
                "**/vendor/**/*.php"
            ]
        },
    ]
}

我做错了什么?有关如何解决此问题的任何想法?

### 更新:我已将原来的正确答案更改为新答案。尽管@romain-prevost 的解决方案有效,但我认为@dark 的方法要简单得多:)

【问题讨论】:

    标签: php docker visual-studio-code vscode-debugger wsl-2


    【解决方案1】:

    忘记其他答案。他们正在工作,但在我看来太复杂了。

    问题是,您无法连接到 xdebug。

    解决方案是告诉 xdebug 将 remote_host 设置为host.docker.internal。本地主机可以使用那里的所有内容。现在您只需在 Visual Studio Code 中通过 hostname 收听 localhost

    等等。 现在,您可以在 phpunit 测试或命令行脚本中调试浏览器调用的内容。

    完整示例

    launch.json

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Listen for XDebug",
                "type": "php",
                "request": "launch",
                "port": 9000,
                "pathMappings": {
                    "/var/www/html/": "${workspaceRoot}"
                },
                "hostname": "localhost"
            }
        ]
    }
    

    php.ini

    [XDebug]
    xdebug.remote_enable = 1
    xdebug.remote_autostart = 1
    xdebug.remote_host = host.docker.internal
    xdebug.remote_port = 9000
    

    XDebug 3 更新

    launch.json

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Listen for XDebug",
                "type": "php",
                "request": "launch",
                "port": 9003,
                "pathMappings": {
                    "/var/www/html/": "${workspaceRoot}"
                },
                "hostname": "localhost"
            }
        ]
    }
    

    php.ini

    [XDebug]
    xdebug.mode = develop
    xdebug.start_with_request = yes
    xdebug.client_host = host.docker.internal
    xdebug.client_port = 9003
    

    【讨论】:

    • 我将在接下来的几天里测试你的方法并反馈反馈。
    • 我已经把正确答案改成了你的,更简单:)
    • 对我来说关键是将主机名键添加到调试配置文件中。 xdebug 设置在 WSL2 上不起作用,因为我需要在 IPV4 地址上设置调试侦听器。原来这也是当初添加这个key的原因之一:github.com/felixfbecker/vscode-php-debug/issues/288
    • golang 项目遇到相同问题的解决方案是什么?
    【解决方案2】:

    我也一直在使用 WSL2 在 Docker 中处理 PHP xdebug。这一切都归结为远程主机。

    php.ini 中的 xdebug 配置是什么?您应该将xdebug.remote_host 设置为您的WSL2 本地IP 地址(您可以使用hostame -I 在终端中获取)。

    我曾多次尝试在我的 Docker 中设置远程主机 IP 地址——编写一个文件以在启动时传递给容器——但总是失败。不过感谢another StackOverflow answer,我也有一个解决方案:

    在 WSL2 中,在 .bashrc 文件中为您的本地 IP 设置一个环境变量。我已将我的设置为

    export IP=$(hostname -I)
    

    在 PHP 服务的 Docker 组合文件中,使用 extra_hosts 键将 IP 地址作为新主机传递。对于 compose v3.2 它是

    extra_hosts:
     - "docker.host:${IP}"
    

    您可以在此处查看其他撰写版本:https://docs.docker.com/compose/compose-file/

    最后,为 xdebug 编辑您的 php.ini 文件,使其包含这一行:

    xdebug.remote_host=docker.host
    

    您的容器将能够使用您的 docker.host 访问 WSL2 发行版并连接到您为 xdebug 设置的端口。

    我花了很多时间弄清楚这一点,主要是因为 WSL2 前几天正式发布,关于它的指南并不多。 最后它并没有那么复杂,但是没有extra_hosts 密钥我无法让 WSL2 IP 地址工作。它在容器和 xdebug 配置中,但我总是收到关于资源不可用的错误,所以不要忘记它?

    【讨论】:

    • 你这个人! :D 从来没有想过 php.ini 中的 remote_host,我让它指向我的 docker 机器(xdebug.remote_host=host.docker.internal)。您的解决方案很容易做到。再次感谢并欢迎使用 StackOverflow :)
    • 这似乎不再起作用。 docker 无法连接到 WSL 实例的 IP 地址。幸运的是,host.docker.internal 正在与主机(windows)共享端口 9000
    【解决方案3】:

    @Romain-prevost 的答案绝对是最简单和最好的方法。如果由于某种原因你不能让它工作,还有另一种选择。

    host.docker.internal 可能可以从您的容器中访问,但默认为 192.* 地址,并且是您基于 Windows 的 Docker IP。因此,您需要设置从 Windows 主机到 WSL2 实例的转发。此脚本in this issue at Github/WSL. 对此进行了概述,您只需在该脚本中将端口更改为9000。您还可以使用 WSL2-Host 在您的主机文件中为该 IP 指定一个命名条目,并进一步修改脚本以限制呼叫/接收 IP。

    【讨论】:

      猜你喜欢
      • 2019-03-05
      • 2020-06-08
      • 2021-11-23
      • 2021-04-07
      • 2022-12-19
      • 2022-07-12
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多