【问题标题】:Docker Compose and Xdebug not working in PhpStormDocker Compose 和 Xdebug 在 PhpStorm 中不起作用
【发布时间】:2020-10-10 15:27:30
【问题描述】:

我尝试了很多方法来让 Xdebug 在 Docker 容器中工作。我接触过这些资源:

我认为问题要么是我不理解的端口,要么是调试器会话没有启动或识别。对于调试器会话,我还尝试安装设置 cookie 的浏览器扩展。

我最终至少拥有了单独的容器,一个作为开发容器并启用了 Xdebug。

docker-compose.yml

version: "3"
services:
  production:
    build: .
    ports:
      - "8000:80"
    volumes:
      - .:/var/www/html
  development:
    build: .
    ports:
      - "8080:80"
#      - "10000:80" also not working
    volumes:
      - .:/var/www/html
      - ./dev.php.ini:/usr/local/etc/php/php.ini

Dockerfile

FROM php:7.4.0-apache

RUN pecl install xdebug \
  && docker-php-ext-enable xdebug

dev.php.ini

xdebug.remote_enable=on
xdebug.remote_host=host.docker.internal
xdebug.remote_port=10000
xdebug.idekey=PHPSTORM

localhost:8080 phpinfo 数据

PhpStorm 配置

有什么想法吗?

【问题讨论】:

  • 我认为你的问题是remote_host,这个主机是调试客户端的IP,你的主机。并且不要认为 host.docker.internal 被解析为您的主机 IP,有一个针对 linux 的 Docker 功能请求打开,并认为他们没有发布修复或改进此问题。
  • 1) xdebug.remote_host=host.docker.internal 仅适用于您的主机操作系统是 Windows 或 Mac -- github.com/docker/for-linux/issues/264。在 Linux 上,您需要自己定位您的主机 IP 地址(例如 ip addr 并查找 docker0 条目)2) # - "10000:80" also not working -- 将不起作用。通过这种方式,您可以将来自操作系统的传入连接转发到容器中。但这是错误的......因为它是连接到 IDE 的 Xdebug,而不是其他方式。所以它是 IDE 监听 Xdebug 端口.. 如果它已经被 Docker 使用,则无法连接。
  • @abestrad 实际上我正在使用 Docker Desktop(适用于 Windows),我在另一个工作示例中看到了这种用法
  • @LazyOne 1) 我正在使用 Docker 桌面(适用于 Windows)。 2)感谢您的解释。 3) 很高兴知道有这篇快速入门文章,但我不再需要它了,猜猜解决方案是什么,重启电脑。

标签: docker docker-compose phpstorm port xdebug


【解决方案1】:

在启动我的机器以使用 @abestrad 和 @LazyOne 的 cmets 进一步调查后,没有更改任何内容,打开 localhost:8080 突然让调试工作通过在我设置的断点处停止。其实在写这个问题之前我已经试过重启 Docker 桌面应用了,可能那个时候我的配置是错误的。

但最终解决方案是:重启电脑

小心

为了确保我也尝试在私人浏览器会话中打开它,但它不再工作了。那是因为特殊的 cookie 仍然设置在普通浏览器存储中(cookie 存储在我已经卸载的浏览器扩展中,或者在写问题之前尝试了 JetBrains Bookmarklets generator)。

让它每次都工作的解决方案是添加以下内容:

xdebug.remote_autostart=1

引用here:

通常您需要使用特定的 HTTP GET/POST 变量来启动远程调试(请参阅步骤调试)。当此设置设置为 1 时,Xdebug 将始终尝试启动远程调试会话并尝试连接到客户端,即使 GET/POST/COOKIE 变量不存在。

【讨论】:

  • xdebug.remote_autostart=1 永久启用它可能很不方便...我建议使用 Xdebug 浏览器扩展(设置 Xdebug cookie)——它工作得很好,你可以完全控制何时开始以及何时停止。
  • 您有不便的示例用例吗?我不想将另一个插件加载到我的浏览器中,并且以另一种方式单独发送该变量的替代方法对我来说似乎不方便。如果我想要没有 x 调试的开发模式,我也可以为此定义另一个容器。
  • 它将尝试调试每个脚本。想象一些可能在后台或计划任务等中运行的 Ajax 请求。当然,这完全取决于您。也许您的项目/设置没有如此广泛的设置,所以根本不会面对它。
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 2017-11-06
  • 1970-01-01
  • 2016-01-07
  • 2019-06-07
  • 1970-01-01
  • 2020-02-19
  • 2018-11-01
相关资源
最近更新 更多