Docker Compose 和 Xdebug 在 PhpStorm 中无法工作

6

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

我认为问题可能要么是我不理解的端口问题,要么是调试器会话未启动或未被识别的问题。对于调试器会话,我还尝试安装了一个设置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

本地主机:8080 phpinfo 数据

输入图像描述

输入图像描述

PhpStorm配置

输入图像描述

有什么想法吗?


我认为你的问题在于remote_host,这个主机是调试客户端的IP地址,也就是你自己的主机。而且不要认为host.docker.internal会被解析成你的主机IP地址,因为在Linux上这是一个Docker功能请求,我认为他们还没有发布修复或改进此问题。 - abestrad
2
  1. 只有在您的主机操作系统为Windows或Mac时,xdebug.remote_host=host.docker.internal 才能正常工作-- https://github.com/docker/for-linux/issues/264。在Linux上,您需要自己查找主机IP地址(例如,使用 ip addr 命令并查找 docker0 条目)。
  2. # - "10000:80" 也不起作用 -- 这种方式将您操作系统中的传入连接转发到容器中。但这是错误的... 因为是Xdebug连接到IDE,而不是反过来。因此,IDE监听Xdebug端口...如果该端口已被Docker使用,则无法建立连接。
- LazyOne
  1. https://blog.jetbrains.com/phpstorm/2018/08/quickstart-with-docker-in-phpstorm/
在PHPStorm中使用Docker快速入门
- LazyOne
@abestrad 实际上我正在使用Docker桌面版(适用于Windows),并且在另一个工作示例中看到了这种用法。 - fabpico
@LazyOne 1) 我正在使用 Docker Desktop(适用于 Windows)。2)感谢您的解释。3)知道有这个快速入门文章很好,但我不再需要它了,猜猜是什么解决方案,电脑重启。 - fabpico
1个回答

4

在@abestrad和@LazyOne的评论下,我启动了我的机器进行进一步调查,没有做出任何更改,打开localhost:8080突然让调试工作停止在我设置的断点处。实际上,在写问题之前,我已经尝试重新启动Docker桌面应用程序,也许那时我的配置处于错误状态。

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

注意

为了确保,我还尝试在私人浏览器会话中打开它,但它不再起作用了。这是因为特殊 cookie 仍然存储在正常浏览器存储中(该 cookie 要么是从我已经卸载的浏览器扩展中存储的,要么是在编写问题之前尝试使用JetBrains Bookmarklets generator存储的)。

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

xdebug.remote_autostart=1

引用自 这里

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


xdebug.remote_autostart=1 这样永久启用它可能会非常不方便... 我建议使用 Xdebug 浏览器扩展(设置 Xdebug cookie)-- 它可以很好地工作,并且您可以完全控制何时开始和何时停止。 - LazyOne
你有不便之处的示例用例吗?我不想在浏览器中加载另一个插件,而另一种选择——以其他方式单独发送该变量,似乎对我来说很不方便。如果我想要没有X调试的开发模式,我也可以为此定义另一个容器。 - fabpico
它将尝试调试每个脚本。想象一下可能在后台运行或定时任务等的某些Ajax请求。当然,这完全取决于您。也许您的项目/设置没有如此广泛的设置,因此根本不会面临这种情况。 - LazyOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接