【问题标题】:Xdebug silently catches connections with no reasonXdebug 无缘无故地默默捕获连接
【发布时间】:2021-05-05 14:08:09
【问题描述】:

应用程序在 docker 容器上运行:nginx 和 php-fpm。 Xdebug 配置了 PhpStorm。该应用程序正常工作,直到突然 Xdebug 开始捕获所有连接,即使我没有启用调试。我什至没有更改任何配置 - 它只是开始这样做(有点神奇,但当然应该有一些东西)。

为什么是 Xdebug:如果我从 Dockerfile 中删除 Xdebug 设置,一切都会开始工作。此外,请求挂起就像我调试它们时发生的那样,即它们在等待几分钟后因504 Gateway Time-out 错误而死。

PhpStorm 不会启动调试会话,因此它会静默发生。关闭 PhpStorm 没有帮助。重新启动容器、docker 守护进程本身甚至操作系统也无济于事。在不同的浏览器中没有任何变化。

php-fpm/Dockerfile:

FROM php:7.3.18-fpm-alpine

RUN apk add --no-cache $PHPIZE_DEPS \
    && pecl install xdebug-2.9.8 \
    && docker-php-ext-enable xdebug

#...there are more lines, but even when I remove them, the issue remains

#When I comment this line and do `docker-compose build && docker-compose down && docker-compose up -d`, 
# the app returns to life.
COPY xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

php-fpm/xdebug.ini:

zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_connect_back=off
xdebug.remote_host=docker.for.mac.localhost
xdebug.remote_port=10000
xdebug.idekey=PHPSTORM
xdebug.remote_autostart=true
xdebug.var_display_max_depth = 16
xdebug.var_display_max_children = 256
xdebug.var_display_max_data = -1

docker-compose.yml:

version: '3.7'
services:
  nginx:
    image: nginx:stable
    volumes:
      - ./docker/nginx/vhost.conf.template:/tmp/vhost.conf.template
      - ./docker/nginx/logs:/logs
      - ./:/app
    depends_on:
      - php-fpm
  php-fpm:
    build: docker/php-fpm
    environment:
      PHP_IDE_CONFIG: serverName=app.local
    volumes:
      - ./:/app

nginx/vhost.conf:

server {
    charset              utf-8;
    client_max_body_size 250M;
    listen               80;

    server_name app.local;
    root        /app/public;
    index       index.php;

    access_log  /logs/nginx.app.access.log;
    error_log   /logs/nginx.app.error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass fpm:9000;
            include /etc/nginx/fastcgi_params;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $request_filename;
    }

    location ~* "/\." {
        deny    all;
        return  404;
    }
}

它是 MacOS 10.14.6 上的 Docker Desktop 2.5.0。

会是什么?

【问题讨论】:

  • 1) 启用 Xdebug 日志,看看它会说什么。 2) 更好地显示您的所有 Xdebug 设置(实际设置)。显示phpinfo() 输出的整个Xdebug 部分,以与运行它相同的方式(CLI 或网页)捕获。在 Linux/Mac 上,为 CLI 和 Web 服务器提供单独的 php.ini 是很常见的。也许您已将连接延迟设置为非常长的值(默认值为 0.2 秒)。 3) 你在那个 TCP 10000 上有什么服务?在您的 Docker 内部以及(最重要的是)在您的主机操作系统(Mac)上。为此使用lsof,例如sudo lsof -nP -iTCP -sTCP:LISTEN
  • 3) 你真的需要xdebug.remote_autostart=true 选项吗?它告诉 Xdebug 尝试调试每个脚本。您是否尝试过使用 Xdebug 浏览器扩展/书签来控制要调试的页面?附言xdebug.remote_host=docker.for.mac.localhost 您现在可以使用 host.docker.internal 一段时间(也适用于 Windows .. 也适用于 Linux 上的小改动)...
  • @LazyOne 感谢您的帮助,您对 TCP 10000 的猜测就是答案。原来我在那个端口上有另一个应用程序在 Xdebug 之前捕获了所有请求。感谢您提供有关设置的提示,我会考虑更改它们

标签: php docker xdebug


【解决方案1】:

为什么是 Xdebug:如果我从 Dockerfile 中删除 Xdebug 设置,一切都会开始工作。此外,请求挂起就像我调试它们时发生的那样,即它们在等待几分钟后因504 Gateway Time-out 错误而死。

启用 Xdebug 日志以确认已建立调试会话并检查那里正在进行的通信(如果有)。这应该会给你一些关于那可能是什么的线索。

无论如何,您的 TCP 10000 端口上似乎已经有一些服务(在您的主机操作系统(Mac)上)阻止 PhpStorm 在那里侦听(IDE 可以检测到 Windows 和 Linux 上已经占用的端口,但在 Mac 上却没有—— WI-29443)。

使用sudo lsof -nP -iTCP -sTCP:LISTEN 之类的内容并检查该服务可能是什么。然后关闭该应用程序或使用另一个端口(用于该应用程序或您的 Xdebug 通信)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多