2

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

4

3 回答 3

7

这对我有用。

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: Connecting to configured address/port: 127.0.0.1:9000 I: Connected to client. :-)

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

I: Checking remote connect back address. I: Checking header 'HTTP_X_FORWARDED_FOR'. I: Checking header 'REMOTE_ADDR'. I: Remote address found, connecting to 172.18.0.1:9000. W: Creating socket for '172.18.0.1:9000', poll: Operation now in progress. E: Could not connect to client. :-(

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

sshd 配置

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

GatewayPorts yes

如果需要,重新启动 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

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

这种方法有什么问题吗?

于 2016-11-18T16:30:30.460 回答
0

我发现你不需要 SSH 隧道来让它工作。

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

容器内

设置 xdebug 选项如下:

xdebug.remote_enable = 1
xdebug.remote_host = localhost
xdebug.remote_port = 10000
xdebug.remote_connect_back = 1

注意:如果使用 nginx-proxy 容器作为反向代理,请将您设置remote_host为您在 VIRTUAL_HOST 中定义的那个

使用 PhpStorm

  • 文件 -> 设置
    • 语言和框架
      • PHP
        • 服务器:添加一个并将主机设置为 localhost:80 使用 Xdebug 并选择路径映射...将 Docker 内部的文件夹(/var/www/)映射到一个
        • 调试:将Xdebug 端口设置为 10000 并选中可以接受外部连接
于 2017-01-20T16:16:05.470 回答
0

usexdebug.remote_host=host.docker.internal无处不在。

于 2020-03-22T13:33:00.913 回答