php - 使用 Docker 和 WSL2 在 VSCode 中调试 PHP 时出现的问题

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

几年来,我一直在 Windows 中使用 VSCode + Docker,并且设法拥有一个完全正常工作的开发环境,没有任何问题。
最近我用 WSL2 设置了一个新的开发环境。将我所有的项目、库、CLI 等移动到 WSL,使用带有 WSL2 容器的 Docker Windows 和 Windows 上的 VSCode 远程连接到 WSL。一切都非常顺利,我喜欢我可以将一切分开的事实。
但是最近我遇到了一个我无法解决的问题,我失去了调试 PHP 文件的能力。
我正在使用 VSCode 远程 WSL 扩展来处理 WSL 内的项目,但是当我尝试调试时,没有任何 react 。
对于我使用的每个开发环境(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 的方法要简单得多:)

最佳答案

我也一直在使用 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 撰写文件中,将 IP 地址作为新主机传递给 extra_hosts。 key 。对于撰写 v3.2 这是
extra_hosts:
 - "docker.host:${IP}"

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

最后,编辑您的 php.ini xdebug 的文件有这一行:
xdebug.remote_host=docker.host

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

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

关于php - 使用 Docker 和 WSL2 在 VSCode 中调试 PHP 时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62104199/

相关文章:

python - 还有其他方法可以解决whatsapp消息自动化吗?

java - 何时使用 GWT 何时不使用

docker - 如何不从 Docker 中的基础镜像继承标签?

linux - 如何优雅地关闭在 Kubernetes 上运行的 Go 服务

protractor - 在Visual Studio代码中设置 Protractor 参数调试

visual-studio-code - Visual Studio Code includePath 子目录

php - 无法将数据从一个表保存到另一个表

php - cakephp 知道 Controller 本身的所有设置变量

php - 如何使用mysql_fetch_array 的结果?

Windows 上的 Linux 容器 (LCOW) 功能与在 Windows 上运行 Linux VM