使用Docker和WSL2在VSCode中调试PHP时出现的问题
我在Windows中使用VSCode+Docker已经有几年了,我成功地创建了一个完全工作的开发环境,没有任何问题 最近我用WSL2建立了一个新的开发环境。使用带有WSL2容器的Docker窗口和远程连接到WSL的Windows上的VSCode,将我的所有项目、库、CLI等移动到WSL中。一切都很顺利,我喜欢我可以把一切分开 但是最近我遇到了一个我无法解决的问题,我失去了调试PHP文件的能力。 我正在使用VSCode远程WSL扩展来处理WSL内部的项目,但当我尝试调试时,什么也没发生 对于我使用的每个开发环境(Windows、MacOS和WSL),我的VSCode中都有树调试设置。除WSL之外的所有工作。当我尝试使用WSL进行调试时,实际上什么都没有发生,没有输出错误,没有调试控制台信息,什么都没有 以下是我的VSCode调试设置:使用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内部的项目,但当我尝试调试时,什么也没发生 对于我使用
{
"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项目,相同问题的解决方案是什么?