8

我正在尝试 Xdebug 3在 PHP 容器中进行配置,并将 XDEBUG_MODEenv 变量设置为off 符合文档 https://xdebug.org/docs/all_settings#modexdebug_info() 显示mode=develop. 怎么修?

Dockerfile:

FROM php:7.4.11-fpm
…
ENV XDEBUG_MODE=off
ENV XDEBUG_CONFIG=""
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug \
...

码头工人-compose.yml:

services:
  php:
    build:
      dockerfile: ${PWD}/.devcontainer/Dockerfile
    image: php-fpm
    environment:
      XDEBUG_MODE: ${XDEBUG_MODE} // off
      XDEBUG_CONFIG: ${XDEBUG_CONFIG}

xdebug 信息:

php -r 'xdebug_info();'
Version => 3.0.0
Support Xdebug on Patreon, GitHub, or as a business: https://xdebug.org/support
Feature => Enabled/Disabled
Development Aids => ✘ disabled
Coverage => ✘ disabled
GC Stats => ✘ disabled
Profiler => ✘ disabled
Step Debugger => ✘ disabled
Tracing => ✘ disabled

                                   PHP                                   
                           Build Configuration                           
Version => 7.4.11
Debug Build => no
Thread Safety => disabled
                                 Settings                                 
Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => /usr/local/etc/php/php.ini
Scan this dir for additional .ini files => /usr/local/etc/php/conf.d
Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-amqp.ini,
/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini,
Directive => Local Value => Master Value

xdebug.mode => develop => develop

更新:

我的案例:我使用 VSCode 来调试我的应用程序,所以只有在 Xdebug 侦听处于活动状态时才需要打开 Xdebug 模块。更好的方法是使用 env XDEBUG_CONFIG 和 XDEBUG_MODE,因为它不需要更改 ini 文件。

4

2 回答 2

4

它确实有效。我的意思是:实际行为/最终结果。

尽管它显示xdebug.mode => develop实际功能已全部关闭:

Feature => Enabled/Disabled
Development Aids => ✘ disabled
Coverage => ✘ disabled
GC Stats => ✘ disabled
Profiler => ✘ disabled
Step Debugger => ✘ disabled
Tracing => ✘ disabled

我已经在 Windows 10 上进行了本地测试 .. 我看到了同样的结果:

php.ini 有

xdebug.mode = debug

没有XDEBUG_MODE覆盖 cmd 显示调试器已启用,因为它应该:

Feature => Enabled/Disabled
Development Aids => ✘ disabled
Coverage => ✘ disabled
GC Stats => ✘ disabled
Profiler => ✘ disabled
Step Debugger => ✔ enabled
Tracing => ✘ disabled
...
xdebug.mode => debug => debug

使用XDEBUG_MODE覆盖:

C:\Users\Andriy
$ SET XDEBUG_MODE=off

C:\Users\Andriy
$ php -r "xdebug_info();"

...
Feature => Enabled/Disabled
Development Aids => ✘ disabled
Coverage => ✘ disabled
GC Stats => ✘ disabled
Profiler => ✘ disabled
Step Debugger => ✘ disabled
Tracing => ✘ disabled
...
xdebug.mode => debug => debug

如果我运行这个命令(传递额外的 Xdebug 配置参数,告诉立即开始调试):

php -dxdebug.start_with_request=yes -r "xdebug_info();"

然后在没有覆盖的情况下,它将尝试建立调试连接,而在没有覆盖的情况下,它不会尝试这样做。这证实了覆盖有效(至少在我的环境中)。

于 2020-12-02T11:55:26.547 回答
1

docker-compose 定义中定义的 XDEBUG_MODE 环境覆盖了 Dockerfile 的默认值。

您的方式仅在您docker-compose使用--env-file( > docker-compose --env-file=xdebug.env ...)调用时才有效

我想您想要的是继承您正在定义内联或已经存在于终端/shell环境中的 XDEBUG_MODE 。在这种情况下,您只需要声明没有任何值的 var

services:
  php:
    environment:
      XDEBUG_MODE

并调用docker-compose类似于> XDEBUG_MODE=Off docker-compose

于 2020-12-03T14:28:34.137 回答