Mac 版 Docker 上的 Xdebug 和 SSH 隧道

2024-04-17

我最近在 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: 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_config 并添加:

GatewayPorts yes

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

在主机上

启动反向 SSH 隧道

运行此命令并将其保持在单独的“终端”选项卡中打开:ssh -p {container_22_port} -R 9000:localhost:1111 [email protected] /cdn-cgi/l/email-protection

其中 {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->Debug change Xdebug->Debug port to 1111(我们用来打开 ssh 隧道的那个)。 PhpStorm 此时应该开始接受来自 xdebug 的连接。

这种方法有什么问题吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mac 版 Docker 上的 Xdebug 和 SSH 隧道 的相关文章

随机推荐

  • Flash AS3 - 如何访问其他帧(也称为非一帧)中的显示对象

    只要该子项位于第一帧中 getChildByName name 就会起作用 其他框架中的显示对象还没有被实例化 所以并不是说不能访问它们 它们不存在可供访问的地方 当播放头进入具有特定对象的关键帧时 会创建该对象并将其添加到舞台中 当播放头
  • Python 多线程

    我有这样的场景 使用 Zope Plone 和一些我的 python API 创建的网页 有一个网页 称之为 a 它通过 python 方法调用数据库 Postgres 并返回一些信息 在页面 a 上 您可以 离线 修改数 据库数据 我的意
  • 如何让 CBC 在时限内返回最佳解决方案? (皮莫)

    我正在尝试在 Pyomo 上使用 CBC v2 10 3 来解决整数线性问题 执行求解器时 我当前设置的时间限制为 600 秒 opt SolverFactory cbc opt options seconds 600 在这个时间限制内 求
  • 在Python中跳过范围函数中的值

    循环一系列数字并跳过一个值的Python式方法是什么 例如 范围是从 0 到 100 我想跳过 50 编辑 这是我正在使用的代码 for i in range 0 len list x listRow list i for j in ran
  • BringIntoView 不起作用

    我在事件处理程序后面有这段代码 private void comboActiveStudentAssignmentType SelectionChanged object sender SelectionChangedEventArgs e
  • Faye 在 jruby 的铁轨上

    我搜索了很多 但找不到任何资源表明我可以将 Faye 与 jruby 一起使用 我已经发现this one https groups google com forum fromgroups topic faye users wvp K38v
  • 在资源路径中找不到 com/sun/jna/android-arm/libjnidispatch.so

    以下所有操作均在 Android Studio 中完成 我已成功编译并测试了 Android Watson Speech to Text 演示应用程序 然后 我创建了一个包含 Watson 相关 API 的库项目和一个带有引用 Watson
  • 如何向 Next.js 静态站点添加网站图标?

    我正在尝试将网站图标添加到 Next js 静态站点 但运气不佳 我尝试使用以下组件自定义文档 next document https nextjs org docs custom document https nextjs org doc
  • 如何连接字符串列表? [复制]

    这个问题在这里已经有答案了 对于你们大多数人来说 这可能非常容易解决 但我无法简单地解决这个问题str 周围可以吗 我想转换这个列表 A B C into A B C In 1 L A B C In 2 join L Out 2 A B C
  • Apache 中的手动内容压缩

    我需要 Apache 上的手动压缩解决方案 我的目标 在我的服务器上提供 gzip 编码的内容以及未压缩的内容 文件已预先压缩 并非所有文件都经过压缩 我想指定这些文件 并且选择不是基于类型 扩展名 的 提供许多内容类型 自定义内容类型 并
  • NuGet 不更新项目引用

    我最近将所有 Visual Studio 2013 项目迁移到 Visual Studio 2015 并按照本文档中记录的步骤进行操作article https docs nuget org consume package restore
  • 为什么在这种无竞争的情况下原子比锁慢得多?

    我使用原子而不是锁编写了一些东西 并且对它在我的情况下慢得多感到困惑 我编写了以下小型测试 include
  • 找不到版本“CXXABI_1.3.8”(...需要)[重复]

    这个问题在这里已经有答案了 当我在编译后运行程序时 出现以下错误 prog usr lib x86 64 linux gnu libstdc so 6 版本CXXABI 1 3 8 not found required by prog pr
  • getchar() 和 putchar() 是函数还是宏?

    我引用了两个可靠的信息来源 两者似乎对同一事物有不同的定义 http www cplusplus com reference clibr E2 80 A6 http www cplusplus com reference clibr E2
  • 如何实时更新glance小部件?

    有可能吗live update的数据Widget using Glance喷气背包组成 就像在数据库发生变化时更新数据一样 例如 当我使用时flow所以 Flow 应该能够更新小部件数据 对吗 我们可以更新点击操作 例如 class MyW
  • 是否可以在没有订阅密钥的情况下调用 Azure API Rest url?

    我只是希望能够使用 Azure Web Api 管理进行休息调用 而无需在 url 中传递订阅密钥 那可能吗 Azure API 管理允许匿名订阅 创建产品而不需要订阅 产品 gt 设置 gt 需要订阅 将您的 API 添加到此产品 htt
  • 是否有理由将数据库连接池与 ActiveRecord 一起使用?

    使用外部连接池有什么好处 我听说大多数其他应用程序都会为每个工作单元打开一个连接 例如 在 Rails 中 我认为这意味着每个请求都可以打开一个新连接 我假设连接池将使这成为可能 我能想到的唯一好处是它允许您拥有 1 000 个前端进程 而
  • 如何用 Java 检测类 Unix 操作系统?

    好的 我知道System getProperty os name 会给我正在运行的操作系统的名称 但这并没有多大帮助 我需要知道的是 我运行的操作系统是否是 类 Unix 操作系统 我不在乎它是 HP UX AIX Mac OS X 还是其
  • 如何在Spring集成中使用两个参数动态调用.handle()内部的重载方法?

    我想让我的 Spring 集成流程对于通过网关传入的不同类型的请求通用 并且我想要重载方法 并希望为通过网关传入的特定消息调用特定的重载方法 flow handle validatorService validateRequest 类似于上
  • Mac 版 Docker 上的 Xdebug 和 SSH 隧道

    我最近在 Docker 社区阅读了很多关于如何使用 Docker for Mac 在 PHPStorm 中调试 PHP 应用程序的帖子 所有这些都包含有用的信息 但在一处还没有看到有效的解决方案 这对我有用 Docker 容器内部 编辑 x