Php Mac Docker上带SSH隧道的Xdebug

Php Mac Docker上带SSH隧道的Xdebug,php,docker,xdebug,ssh-tunnel,docker-for-mac,Php,Docker,Xdebug,Ssh Tunnel,Docker For Mac,我最近读了很多Docker社区的帖子,内容是关于如何使用Docker for Mac在PHPStorm中调试PHP应用程序。它们都包含一些有用的信息,但在一个地方还没有看到有效的解决方案 以下是我的工作经历 码头集装箱内 编辑xdebug配置 验证xdebug是否正常工作 此时,请尝试运行PHP应用程序。日志应包含每个请求的此类条目: I:连接到配置的地址/端口:127.0.0.1:9000 I:已连接到客户端。:-) 如果在日志中看到类似的情况,则说明远程主机或远程连接回配置不正确 I:检查远

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

以下是我的工作经历

码头集装箱内 编辑xdebug配置 验证xdebug是否正常工作 此时,请尝试运行PHP应用程序。日志应包含每个请求的此类条目:

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

如果在日志中看到类似的情况,则说明远程主机或远程连接回配置不正确

I:检查远程回接地址。
I:检查标题“HTTP\u X\u转发\u FOR”。
I:检查标题“远程地址”。
I:找到远程地址,正在连接到172.18.0.1:9000。
W:正在为“172.18.0.1:9000”创建套接字,轮询:操作正在进行。
E:无法连接到客户端:-(

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

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

网关端口是

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

在主机上 启动反向SSH隧道 运行此命令并使其在单独的终端选项卡中保持打开状态:
ssh-p{container_22_port}-R 9000:localhost:1111root@127.0.0.1

其中{container_22_port}是主机上映射到docker容器上exdposed 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 选择
文件
->
默认设置
,然后在
语言和框架
->
PHP
->
调试
Xdebug
->
调试端口
更改为
1111
(我们用来打开ssh隧道的那个)。 PhpStorm此时应该开始接受来自xdebug的连接


这种方法有什么问题吗?

我发现不需要SSH隧道就能让它工作

Xdebug只需要连接到正在运行的IDE调试器,但可能已经使用了一些默认端口,如FPM(9000)的端口

容器内 将xdebug选项设置为:

xdebug.remote_enable = 1
xdebug.remote_host = localhost
xdebug.remote_port = 10000
xdebug.remote_connect_back = 1
注意:如果使用nginx代理容器作为反向代理,请将您的
远程\u主机设置为您在虚拟\u主机中定义的主机

使用PhpStorm
  • 文件->设置
    • 语言和框架
      • PHP
        • 服务器:添加一个并将主机设置为localhost:80,选择了路径映射的Xdebug…将Docker(/var/www/)中的文件夹映射到一个
        • 调试:将Xdebug端口设置为10000,并选中“可以接受外部连接”

使用
xdebug.remote\u host=host.docker.internal
无处不在。

这是一个问题还是一个答案?转换为问题和答案所以接受答案是有意义的,不是吗?这是一个很好的答案,我相信你的努力会得到极大的赞赏。我只是说这篇哈布拉风格的文章更适合你。对不起,我f我以前的评论有点误导。如果这不是已经在某个地方的文档,你应该肯定地考虑把这个贡献给社区文档,或者XDebug,这真的很好,我喜欢这个解决方案,我对{Cululer-22i端口}感到困惑。
xdebug.remote_enable = 1
xdebug.remote_host = localhost
xdebug.remote_port = 10000
xdebug.remote_connect_back = 1