php - 在 Docker for Mac 上使用 SSH 隧道的 Xdebug

标签 php docker xdebug ssh-tunnel docker-for-mac

我最近在 Docker 社区阅读了很多关于如何使用 Docker for Mac 在 PHPStorm 中调试 PHP 应用程序的帖子。它们都包含一些有用的信息,但还没有在一个地方看到有效的解决方案。

最佳答案

这对我有用。

Docker 容器内部

编辑xdebug配置

# automatically start debugger on every request
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9000
# send all debug requests to 127.0.0.1, remote_connect_back should be turned off
xdebug.remote_connect_back = 0
xdebug.remote_host=127.0.0.1

#log all xdebug requests to see is it working correctly
xdebug.remote_log=/var/log/remote.log

验证 xdebug 是否有效

此时尝试运行 PHP 应用程序。日志应包含每个请求的此类条目:

I:连接到配置的地址/端口:127.0.0.1:9000 I:连接到客户端。 :-)

如果您在日志中看到类似这样的内容,则说明 remote_host 或 remote_connect_back 配置不正确。

I:检查远程连接返回地址。 I:检查 header “HTTP_X_FORWARDED_FOR”。 I:检查 header “REMOTE_ADDR”。 I:找到远程地址,连接到 172.18.0.1:9000。 W:为“172.18.0.1:9000”创建套接字,轮询:操作正在进行中。 E: 无法连接到客户端。 :-(

我见过 Xdebug 在 CLI 中工作但在浏览器中不工作的情况,当这个问题出现在日志中时,remote_connect_back=0 修复了它。

sshd配置

为了允许到容器的 ssh 隧道:编辑/etc/ssh/sshd_conf 并添加:

GatewayPorts 是

如果需要重新启动 sshd(理想情况下这应该是 Dockerfile 的一部分)。

在主机上

启动反向SSH隧道

运行此命令并将其保持在单独的终端选项卡中打开: ssh -p {container_22_port} -R 9000:localhost:1111 root@127.0.0.1

其中 {container_22_port} 是主机上映射到 docker 容器上暴露的 22 端口的端口。 9000 是 Xdebug 在容器内使用的端口,1111 端口将被宿主机用来监听 Xdebug 连接。

用netcat测试

此时您可以验证 Xdebug 是否确实将信息从 docker 容器内部传递到主机。启动 netcat 查看发送到 1111 端口的内容并运行 php 应用程序:

nc -l 1111

你应该看到这样的东西:

<?xml version="1.0" encoding="iso-8859-1"?>
<init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///var/www/magento2/index.php" language="PHP" xdebug:language_version="7.0.12" protocol_version="1.0" appid="1006" idekey="XDEBUG_ECLIPSE"><engine version="2.5.0rc1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2016 by Derick Rethans]]></copyright></init>

配置PhpStorm

打开File->DefaultSettings,然后在Languages&Frameworks->PHP->Debug Xdebug->Debug port更改为1111(我们用来打开ssh隧道的那个)。 此时 PhpStorm 应该开始接受来自 xdebug 的连接。

这种方法有什么问题吗?

关于php - 在 Docker for Mac 上使用 SSH 隧道的 Xdebug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40666083/

相关文章:

php - CodeIgniter SELECT 语句错误结果

php - 如何在php中回显sql数据库中的指定数据

javascript - 如何让按钮填充 Wordpress 中 Mailchimp 弹出表单的模式

javascript - AJAX jquery mobile php表单提交在没有刷新的情况下不会更新

Docker:无法使用 VictoriaMetrics "vmagent"抓取 SonarQube,连接被拒绝

python - 连接被对方​​拒绝 : 10061: No connection could be made because the target machine actively refused it

docker - 带有 terraform 和 efs 的 AWS ECS 任务定义 - 未知卷

php - 调试PHP

php - 检查 URL 是否有效(来自 php soap 客户端)

php - Docker PHP ext启用命令失败