在 Windows 上将 Xdebug 和 PhpStorm 与 Docker 容器结合使用

Mic*_*kin 6 php windows xdebug phpstorm docker

我正在尝试使用 PhpStorm 使 Xdebug 适用于 Windows 上的 Docker 容器。我阅读了不同的文章和其他线程,但它仍然不起作用。

在 docker-compose.yaml 中,我的应用程序容器有以下配置:

version: "3.7"
services:

  #PHP Service
  app:
    build:
      args:
        user: user
        uid: 1000
      context: ./
      dockerfile: docker/php/Dockerfile
    image: rpg
    container_name: rpg-app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
      PHP_IDE_CONFIG: serverName=RpgServer
    working_dir: /var/www
    command: /var/www/docker/php/application-init.sh
    volumes:
      - ./:/var/www
      - ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - rpg-app-network
    depends_on:
      - db

  ...

  #Nginx Service
  nginx:
    image: nginx:1.17-alpine
    container_name: rpg-nginx
    restart: unless-stopped
    tty: true
    ports:
      - "8080:80"
      - "443:443"
    volumes:
      - ./:/var/www
      - ./docker/nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - rpg-app-network
    depends_on:
      - app
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

使用phpinfo()我得到以下 php 配置: 在此输入图像描述

在此输入图像描述

在此输入图像描述

我有以下 PhpStorm 配置:

服务器
在此输入图像描述

调试
在此输入图像描述

DBGp 代理(并不真正认为相关) 在此输入图像描述

以及 PHP 远程调试 在此输入图像描述

我使用 Chrome 的 Xdebug Helper 插件来发送会话密钥 在此输入图像描述

我可以看到phpinfo()PHP 收到了 Xdebug 会话密钥:

在此输入图像描述 在此输入图像描述

我正在 PhpStorm 中监听 Xdebug 连接(在整个代码中都有断点): 在此输入图像描述 在此输入图像描述

我在启用了 Xdebug Helper 的浏览器中运行该应用程序。

然而。断点不会造成您期望的阻塞,也不会回调 PhpStorm。

如果我尝试在 PhpStorm 中使用调试器配置验证,我会得到以下信息: 在此输入图像描述

Mic*_*kin 5

感谢LazyOne的帮助,我再次查看了配置,发现单步调试器已被禁用。在此输入图像描述

我在 php-fpm Dockerfile 中按以下方式安装 Xdebug:

# Install xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug
Run Code Online (Sandbox Code Playgroud)

这是我原来的 Xdebug 配置:

[xdebug]
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM
xdebug.remote_log=/var/www/storage/logs/xdebug.log
xdebug.remote_mode = req
Run Code Online (Sandbox Code Playgroud)

我添加了

xdebug.mode = debug
Run Code Online (Sandbox Code Playgroud)

重新运行后,docker-compose up我开始在容器日志中收到通知:

rpg-app  | NOTICE: PHP message: Xdebug: [Step Debug] Could not connect to debugging client. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port) :-(
Run Code Online (Sandbox Code Playgroud)

我发现这个线程 Xdebug: [Step Debug] Could not connect to debug client

并补充道:

xdebug.client_host=host.docker.internal
xdebug.client_port=9001
Run Code Online (Sandbox Code Playgroud)

得到:

[xdebug]
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_connect_back=0
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM
xdebug.remote_log=/var/www/storage/logs/xdebug.log
xdebug.remote_mode = req
xdebug.mode = debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9001
Run Code Online (Sandbox Code Playgroud)

现在一切正常了!:)

编辑:根据 LazyOne 的评论,我更新了 Xdebug v3 配置设置。结果是:

[xdebug]

xdebug.idekey=PHPSTORM

xdebug.mode = debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9001

xdebug.log=/var/www/storage/logs/xdebug.logs
Run Code Online (Sandbox Code Playgroud)


小智 2

从表面上看,您已经正确设置了所有内容,除了源路径映射(您可以在 PHPStorm 中的服务器下找到它)。这通常是断点不起作用的原因。另请尝试启用“在第一行中断”选项。

除非您确实需要 docker compose 进行运输,否则我强烈建议使用Lando。它始终具有正确的 XDebug 配置,并且具有可使用的真实 (https) URL 有很大帮助。