【问题标题】:Configure Xdebug in PHP-FPM Docker container在 PHP-FPM Docker 容器中配置 Xdebug
【发布时间】:2017-12-29 18:14:32
【问题描述】:

我基本上是在使用这个配置来为 Symfony 项目https://github.com/maxpou/docker-symfony 创建开发环境。它运行但我无法让 Xdebug 工作:当我设置断点时它不会停止。

我还尝试将 Xdebug 配置为使用 connect_back,但这不起作用。也许这与我在 Windows 机器上开发的事实有关?非常感谢任何见解。

Dockerfile PHP:FPM

# See https://github.com/docker-library/php/blob/master/7.1/fpm/Dockerfile
FROM php:7.1-fpm
ARG TIMEZONE

MAINTAINER Maxence POUTORD <maxence.poutord@gmail.com>

RUN apt-get update && apt-get install -y \
    openssl \
    git \
    unzip

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version

# Set timezone
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone
RUN printf '[PHP]\ndate.timezone = "%s"\n', ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini
RUN "date"

# Type docker-php-ext-install to see available extensions
RUN docker-php-ext-install pdo pdo_mysql


# install xdebug
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
#RUN echo "xdebug.remote_connect_back=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.idekey=\"PHPSTORM\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# DockerNAT gateway IP
RUN echo "xdebug.remote.host=10.0.75.1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote.mode=req" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote.handler=dbgp" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini


RUN echo 'alias sf="php app/console"' >> ~/.bashrc
RUN echo 'alias sf3="php bin/console"' >> ~/.bashrc

WORKDIR /var/www/free-energy/symfony

docker-compose.yml:

# https://github.com/maxpou/docker-symfony
version: '2'

services:
    db:
        image: mysql
        volumes:
            - "./.data/db:/var/lib/mysql"
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    php:
        build:
            context: php7-fpm
            args:
                TIMEZONE: ${TIMEZONE}
        volumes:
            - ${SYMFONY_APP_PATH}:/var/www/free-energy/symfony
            - ./logs/symfony:/var/www/free-energy/symfony/app/logs
        environment:
            PHP_IDE_CONFIG: serverName=free-energy.org
    nginx:
        build: nginx
        ports:
            - 80:80
        volumes_from:
            - php
        volumes:
            - ./logs/nginx/:/var/log/nginx
    elk:
        image: willdurand/elk
        ports:
            - 81:80
        volumes:
            - ./elk/logstash:/etc/logstash
            - ./elk/logstash/patterns:/opt/logstash/patterns
        volumes_from:
            - php
            - nginx

【问题讨论】:

  • 在您的教程@TarunLalwani 的帮助下,我终于进行了调试。关键 xdebug.remote.host 现在是 xdebug.remote_host 并且 IP 现在指向我的主机而不是 dockerNat 地址。我非常感谢几天后有些东西起作用了。不过,我认为重新启动后,我的主机 IP 会每天更改一个手动步骤。同样在 SSH 解决方案中,root@host-ip 指向主机 IP,所以这并不能帮助我:) 对此有什么想法吗?
  • 1) “Xdebug 配置为在端口 9001 上运行,因为 FPM 在端口 9001 上运行” 我假设您的意思是最后一个中包含 9000 .. 否则它不会很有意义。 2) 只有在运行 IDE 的操作系统/计算机上已经使用了默认的 xdebug 端口(例如,通过 php-fpm),这样的更改才有意义。仅将其放在 Docker 容器中并不需要进行此类更改(因为 xdebug 不会连接到该 IP)。
  • @LazyOne 1)您的假设是正确的。 2)我用端口 9000 试了一下,它确实也有效。此配置具有我的偏好,因为它具有默认值。谢谢

标签: php windows docker-compose phpstorm xdebug


【解决方案1】:

Xdebug 流量无法返回到我的主机。当我在 xdebug.remote_host 中输入主机的 IP 地址时,调试工作正常,但这并不理想,因为我的 IP 在每次重新启动时都会更改。幸运的是,Docker 提供了一种通过 DNS 入口 docker.for.win.localhost 获取主机 IP 的方法。

编辑:
Docker 现在有一个独立于平台的 DNS 入口 host.docker.internal

我尝试使用 xdebug.remote_connect_back=1 来响应流量,但它不起作用。 Phpinfo() 显示 REMOTE_ADDR 设置为 localhost。在这种情况下,Localhost 指向 Docker PHP 容器,而它应该指向我们的主机 IP。重要的是要知道这个设置是 .ini 中的 xdebug.remote_host 将被忽略。

来自 Xdebug 文档:

xdebug.remote_connect_back 类型:boolean,默认值:0,在Xdebug >= 2.1中引入

如果启用,xdebug.remote_host 设置将被忽略,Xdebug 将尝试连接到发出 HTTP 请求的客户端。

这是适用于 PHP Docker 容器的带有 xdebug.ini 配置的 Dockerfile:

FROM php:7.1-fpm
ARG TIMEZONE

MAINTAINER Maxence POUTORD <maxence.poutord@gmail.com>

RUN apt-get update && apt-get install -y \
    openssl \
    git \
    unzip

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version

# Set timezone
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone
RUN printf '[PHP]\ndate.timezone = "%s"\n', ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini
RUN "date"

# Type docker-php-ext-install to see available extensions
RUN docker-php-ext-install pdo pdo_mysql

# install xdebug
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug
RUN echo "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

# relevant to this answer
RUN echo "xdebug.idekey=\"PHPSTORM\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_host=docker.for.win.localhost" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

RUN echo 'alias sf="php app/console"' >> ~/.bashrc
RUN echo 'alias sf3="php bin/console"' >> ~/.bashrc

WORKDIR /var/www/free-energy/symfony


编辑:
在这篇文章中,我经常使用 XDebug。
现在我知道您的 XDebug 配置不必像我当时那样大。

xdebug.ini:(在您的 Docker PHP 映像中)。

zend_extension=xdebug.so

[Xdebug]
xdebug.remote_enable=true
xdebug.remote_port=9000
xdebug.remote_host=host.docker.internal

【讨论】:

    【解决方案2】:

    添加remote_connect_back=on,因此xdebug 连接到当前访问者(使用REMOTE_ADDR 系统变量)而不是可能改变的remote_host。您也可以尝试使用 remote_autostart=on,以确保此问题与浏览器本身无关。

    记得在 phpStorm 中配置映射,但无论如何它都会告诉你这样做。还要确保 IDE 正在侦听调试会话(调试工具栏中的小开关)。祝你好运。

    【讨论】:

    • 你的建议很有趣。我注释掉了 xdebug.remote_host=10.113.85.60 并添加了 debug.remote_connect_back=1。不幸的是,执行不再在断点处停止。也许另一个键正在破坏它,但我检查了 Xdebug 文档中的 debug.remote_connect_back 并且没有这样的说明。
    • debug.remote_connect_back=1 经常不起作用(会检测到错误的 IP),尤其是如果您涉及多个容器(如本例)
    • 应该是 xdebug.remote_connect_back。 @LazyOne 这不是真的,一切都应该正常,我有很多这样的项目,xdebug 就像一个魅力。至于作者:删除除connect_back、port、autostart 和remote_remote_enable 之外的所有设置。验证设置是否应用 phpinfo()。
    • @mike 完全不确定;否则我不会看到像stackoverflow.com/a/46265103/783119stackoverflow.com/a/47450391/783119 和类似的问题和解决方案(标记为xdebug+phpstorm+docker)。据我所见——并非每个 docker 设置都会“报告”正确的 IP 以供 xdebug 拾取——没有具体的原因。
    • 不知道如何配置 xdebug 的人提供的解决方案。在此配置中,REMOTE_ADDR 将报告网关(您在网络中的接口),例如 172.x.x.x/16,它是可路由的,并将连接回 phpStorm。就像我说的,我在生产和开发中都广泛使用 docker,xdebug 总是可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2019-04-13
    • 2018-07-17
    相关资源
    最近更新 更多