【问题标题】:How do I get xdebug/step-debugging working with ddev?如何让 xdebug/step-debugging 与 ddev 一起工作?
【发布时间】:2018-09-15 13:28:43
【问题描述】:

我一直在我的 Drupal 项目中使用 ddev,现在想使用 xdebug,所以我可以使用 PhpStorm 进行逐步调试(或者实际上任何 IDE 都可以)。但我似乎无法让它在断点处停止。我试图关注instructions in ddev docs,但这并不能让我继续前进,我不知道下一步该做什么。我做到了:

  • 按照此处所述设置 172.28.99.99 IP 地址
  • 使用 config.yaml xdebug_enabled: trueddev start 启用 xdebug(并通过 phpinfo 检查是否已启用 xdebug。)
  • 将 PHPStorm 置于“侦听调试连接”模式

【问题讨论】:

  • 收集 xdebug 日志——只有这样你才能看到正在发生的事情。

标签: phpstorm xdebug ddev


【解决方案1】:

小心使用 Mac,因为它们可能正在运行 php-fpm。如果是这种情况,PHP Storm 将找不到连接(因为它已经被 php-fpm 占用了)。

看看是不是这样运行:

lsof -i :9000 -sTCP:LISTEN

如果它返回类似 php-fpm 的东西,那么你有这个问题

尝试关闭它(参见PHP-FPM can't be closed)。

修复后运行它(可能重新启动你的 Mac),你应该会看到如下内容:

➜  solrpoc lsof -i :9000 -sTCP:LISTEN
COMMAND  PID             USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
phpstorm 512 alejandro.moreno  490u  IPv6 0xaf3eef0f3233a83      0t0  TCP *:cslistener (LISTEN)

【讨论】:

  • 如果 php-fpm 已安装并使用 homebrew 启动,brew services stop php。 2022 年,ddev 将开始使用端口 9003 而不是 9000,因为除了 9000 之外,PhpStorm 和 vscode 都在 9003 上侦听。
【解决方案2】:

在任何设置中调试 xdebug 都可能有点麻烦,但可以采取以下步骤:

  • 首先,重读docs
  • 确保您拥有 2019+ 版本的 PHPStorm。许多 PHPStorm 版本(包括?) 2018.3 与较新的 XDebug 版本不兼容。
  • 确保已启用 xdebug;出于性能原因,它默认禁用。大多数人在需要时使用ddev exec enable_xdebug 启用它,并在使用完后使用ddev exec disable_xdebug,但也可以在.ddev/config.yaml 中启用它。
  • 不要假设正在执行一些晦涩难懂的代码并在此处设置断点。首先在 index.php 的第一个可执行行放置一个断点。哦,很多时候人们认为它应该停止,但他们的代码没有被执行。
  • ddev ssh 进入网络容器。你能ping host.docker.internal(并得到回复)吗?如果不能,则可能是防火墙过于激进。
  • 在 PHPStorm 中,禁用“监听连接”按钮,使其不会监听。或者直接退出 PHPStorm。
  • ddev ssh:可以telnet host.docker.internal 9000连接吗?如果是这样,那么您在端口 9000 上运行了其他东西,可能是 php-fpm。使用 lsof -i :9000 -sTCP:LISTEN 找出并阻止它,或使用 change the xdebug port and configure PHPStorm to use the new one 。在您的 telnet 命令未连接之前不要继续。
  • 现在点击 PHPStorm 上的监听按钮开始监听连接。
  • ddev ssh 并再次尝试telnet host.docker.internal 9000。它应该连接。如果没有,可能 PHPStorm 没有监听,或者没有配置监听 9000 端口?
  • 检查以确保 Xdebug 已启用。您可以在容器内使用php -i | grep grep Xdebug,或者使用任何其他您想要的技术来提供phpinfo() 的输出,包括Drupal 的admin/reports/status/php。你应该看到with Xdebug v2.9.6, Copyright (c) 2002-2020 php -i | grep "xdebug.remote_enable" 应该给你xdebug.remote_enable: On
  • 在项目的 index.php 的第一相关行设置断点,然后使用浏览器访问该站点。它应该停在那里。

来自@heddn 的注释:如果您想让 xdebug 仅针对 fpm 运行,例如 phpenmod -s fpm xdebug,而不是运行 enable_xdebug

@mfrieling 的注释:如果您使用像 XDebug Helper 这样设置 IDE 密钥的浏览器扩展程序,则必须与服务器上的相同。由于DDEV 1.10.0 “在 web 和 db 容器中为你创建了一个真实的用户,使用你的用户名和用户 ID”,默认情况下也用作 IDE 密钥。服务器上使用的 IDE 密钥、发送的浏览器扩展/cookie 和 PHPStorm 必须相同。您可以通过使用以下两行创建文件 .ddev/php/xdebug.ini 来更改 DDEV 中的 IDE 密钥(将 PHPSTORM 替换为您要使用的值:

[XDebug]
xdebug.idekey = PHPSTORM

欢迎您的跟进!

【讨论】:

  • 出色的调试故障!我遵循了所有步骤,但仍然遇到问题,事实证明 xdebug 还没有在 php 7.3 上正常运行,所以我将我的 ddev 配置降低到 7.2,它运行 OOTB!认为应该记录在某处:P
  • 感谢您提供出色的调试步骤。在我的情况下,ping host.docker.internal 的步骤失败了,解决方案不是过于激进的防火墙,而是这个:github.com/docker/for-mac/issues/2965#issuecomment-574832076 使用 Mac 和最新的 Docker for Mac、DDEV 和 PhpStorm 版本。
  • 我有可怕的永久“等待连接”显示。通过从 PHP 7.3 更新到 PHP 7.4(现在是 2021 年,宝贝)解决了这个问题。此外,更改 xdebug 端口,如您的第 7 个项目符号中所述。这个答案现在被收藏了!
【解决方案3】:

谢谢,遇到了同样的问题,添加文件.ddev/docker-compose.xdebug.yaml 解决了这个问题。

但是,我在 Mac / OSX 上运行,发现这些附加步骤可以从容器内部发现内部主机的 IP 地址:

1.) 登录网络容器ddev ssh

2.) 运行ping docker.for.mac.localhost

3.) 在上述yaml文件中设置host.docker.internal返回的IP地址。

4.) 删除并启动 DDEV。

另外值得一提的是 PHPStorm 中的validating xdebug 对检查配置很有用。

【讨论】:

  • docker.for.mac.localhost 应该与 host.docker.internal 相同,这是 Docker 提供该地址的一种较旧的方式。在当前版本的 Docker for Mac 和 ddev 中,您不必做任何这些事情。
猜你喜欢
  • 2015-01-06
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
相关资源
最近更新 更多