Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Docker和WSL2在VSCode中调试PHP时出现的问题_Php_Docker_Visual Studio Code_Vscode Debugger_Wsl 2 - Fatal编程技术网

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

使用Docker和WSL2在VSCode中调试PHP时出现的问题,php,docker,visual-studio-code,vscode-debugger,wsl-2,Php,Docker,Visual Studio Code,Vscode Debugger,Wsl 2,我在Windows中使用VSCode+Docker已经有几年了,我成功地创建了一个完全工作的开发环境,没有任何问题 最近我用WSL2建立了一个新的开发环境。使用带有WSL2容器的Docker窗口和远程连接到WSL的Windows上的VSCode,将我的所有项目、库、CLI等移动到WSL中。一切都很顺利,我喜欢我可以把一切分开 但是最近我遇到了一个我无法解决的问题,我失去了调试PHP文件的能力。 我正在使用VSCode远程WSL扩展来处理WSL内部的项目,但当我尝试调试时,什么也没发生 对于我使用

我在Windows中使用VSCode+Docker已经有几年了,我成功地创建了一个完全工作的开发环境,没有任何问题

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

但是最近我遇到了一个我无法解决的问题,我失去了调试PHP文件的能力。 我正在使用VSCode远程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的方法要简单得多:)

我一直在使用WSL2在Docker中与PHP xdebug进行斗争。这一切都取决于远程主机

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

我曾多次尝试在Docker中设置远程主机IP地址,在启动时将文件传递给容器,但总是失败。不过,多亏了,我也有了一个解决方案:

在WSL2中,在
.bashrc
文件中为本地IP设置一个环境变量。我已经决定了

export IP=$(hostname -I)
在PHP服务的Docker compose文件中,使用
extra_hosts
键将IP地址作为新主机传递。对于composev3.2,它是

extra_hosts:
 - "docker.host:${IP}"
您可以在此处查找其他撰写版本:

最后,编辑xdebug的
php.ini
文件,使其具有以下行:

xdebug.remote_host=docker.host
您的容器将能够使用
docker.host
到达WSL2发行版,并连接到您为xdebug设置的端口

我花了很多时间来弄清楚这一点,主要是因为WSL2在几天前正式发布,并且没有太多关于它的指南。
最后它并没有那么复杂,但如果没有
额外的\u hosts
键,我就无法让WSL2 IP地址正常工作。它在容器和xdebug配置中,但我总是得到一个关于资源不可用的错误,所以不要忘记,@Romain prevost的答案肯定是最简单和最好的方法。如果出于某种原因,你不能让它发挥作用,还有另一种选择


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

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

问题是,您无法连接到xdebug

解决方案是告诉xdebug将远程主机设置为
host.docker.internal
。本地主机可以使用其中的所有内容。现在,您只需通过hostname在VisualStudio代码中收听localhost

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

完整示例 launch.json

{
“版本”:“0.2.0”,
“配置”:[
{
“名称”:“侦听XDebug”,
“类型”:“php”,
“请求”:“启动”,
“港口”:9000,
“路径映射”:{
“/var/www/html/”:“${workspaceRoot}”
},
“主机名”:“本地主机”
}
]
}
php.ini

[XDebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = host.docker.internal
xdebug.remote_port = 9000
[XDebug]
xdebug.mode = develop
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
XDebug 3的更新 launch.json

{
“版本”:“0.2.0”,
“配置”:[
{
“名称”:“侦听XDebug”,
“类型”:“php”,
“请求”:“启动”,
“港口”:9003,
“路径映射”:{
“/var/www/html/”:“${workspaceRoot}”
},
“主机名”:“本地主机”
}
]
}
php.ini

[XDebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = host.docker.internal
xdebug.remote_port = 9000
[XDebug]
xdebug.mode = develop
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003

你这个人我从未想过php.ini中的远程主机,我让它指向我的docker机器(xdebug.remote\u host=host.docker.internal)。你的解决方案很容易做到。再次感谢并欢迎使用StackOverflow:)这似乎不再有效。docker无法连接到WSL实例的IP地址。幸运的是,host.docker.internal正在与主机(windows)共享端口9000。我将在接下来的几天内测试您的方法并获得反馈。我已将正确答案更改为您的答案,这很简单:)我的关键是将主机名键添加到调试配置文件中。xdebug安装程序无法在WSL2上运行,因为我需要在IPV4地址上设置调试侦听器。事实证明,这是添加此密钥的原因之一:对于golang项目,相同问题的解决方案是什么?