使用 Docker 和 WSL2 在 VSCode 中调试 PHP 时出现问题
Issues when Debugging PHP in VSCode using Docker and WSL2
我已经在 Windows 中使用 VSCode + Docker 多年了,并且成功地拥有了一个完整的开发环境,没有任何问题。
最近我使用 WSL2 设置了一个新的开发环境。将我所有的项目、库、CLI 等移动到 WSL 中,使用 Docker Windows 和 WSL2 容器,并在 Windows 上使用 VSCode 远程连接到 WSL。一切都非常顺利,我喜欢我可以把所有东西分开的事实。
但最近我遇到了一个我无法解决的问题,我失去了调试 PHP 文件的能力。
我正在使用 VSCode 远程 WSL 扩展来处理我在 WSL 中的项目,但是当我尝试调试时,没有任何反应。
我在 VSCode 中为我使用的每个开发环境(Windows、MacOS 和 WSL)设置了树调试设置。除 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 Whosebug answer,但是,我也有一个解决方案:
在 WSL2 中,在 .bashrc
文件中为本地 IP 设置环境变量。我已将我的设置为
export IP=$(hostname -I)
在 Docker 为 PHP 服务编写的文件中,使用 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 配置中,但我总是收到关于资源不可用的错误,所以不要忘记它
@Romain-prevost 的回答绝对是最简单最好的方法。如果由于某种原因你无法让它工作,还有另一种选择。
host.docker.internal
可能可以从您的容器内访问,但默认情况下是 192.* 地址,并且是您基于 Windows 的 Docker IP。因此,您需要设置从 Windows 主机到 WSL2 实例的转发。此脚本 in this issue at Github/WSL. You would simply change the ports to 9000
in that script. You could also use WSL2-Host 对此进行了概述,以便在您的主机文件中为该 IP 指定一个条目,并进一步修改脚本以同时限制 calling/receiving 个 IP。
忘记其他答案。他们正在工作,但在我看来太复杂了。
问题是,您无法连接到 xdebug。
解决方案是告诉xdebug 将remote_host 设置为host.docker.internal
。本地主机可以使用那里的所有内容。现在你只需要通过 hostname
.
收听 Visual Studio 代码到 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
我已经在 Windows 中使用 VSCode + Docker 多年了,并且成功地拥有了一个完整的开发环境,没有任何问题。
最近我使用 WSL2 设置了一个新的开发环境。将我所有的项目、库、CLI 等移动到 WSL 中,使用 Docker Windows 和 WSL2 容器,并在 Windows 上使用 VSCode 远程连接到 WSL。一切都非常顺利,我喜欢我可以把所有东西分开的事实。
但最近我遇到了一个我无法解决的问题,我失去了调试 PHP 文件的能力。 我正在使用 VSCode 远程 WSL 扩展来处理我在 WSL 中的项目,但是当我尝试调试时,没有任何反应。
我在 VSCode 中为我使用的每个开发环境(Windows、MacOS 和 WSL)设置了树调试设置。除 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 Whosebug answer,但是,我也有一个解决方案:
在 WSL2 中,在 .bashrc
文件中为本地 IP 设置环境变量。我已将我的设置为
export IP=$(hostname -I)
在 Docker 为 PHP 服务编写的文件中,使用 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 配置中,但我总是收到关于资源不可用的错误,所以不要忘记它
@Romain-prevost 的回答绝对是最简单最好的方法。如果由于某种原因你无法让它工作,还有另一种选择。
host.docker.internal
可能可以从您的容器内访问,但默认情况下是 192.* 地址,并且是您基于 Windows 的 Docker IP。因此,您需要设置从 Windows 主机到 WSL2 实例的转发。此脚本 in this issue at Github/WSL. You would simply change the ports to 9000
in that script. You could also use WSL2-Host 对此进行了概述,以便在您的主机文件中为该 IP 指定一个条目,并进一步修改脚本以同时限制 calling/receiving 个 IP。
忘记其他答案。他们正在工作,但在我看来太复杂了。
问题是,您无法连接到 xdebug。
解决方案是告诉xdebug 将remote_host 设置为host.docker.internal
。本地主机可以使用那里的所有内容。现在你只需要通过 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