0

我无法在 Docker + WSL 2 内的 WP Dev Env 上使用 XDebug 3 进行步骤调试

这是我的文件夹结构

在此处输入图像描述

忽略references.txt文件,这里没有用。

wordpress文件夹将包含所有 wordpress 文件。它在开始时是一个空文件夹,但在通过 docker-compose up 设置开发环境时将填充 WordPress 文件。

注意:所有这些文件都在通过 WSL 2 安装的 ubuntu 20.04 中。


docker-compose.yml文件

version: "3.9"

services:
  db:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_DATABASE: "wordpress"
      MYSQL_USER: "wp"
      MYSQL_PASSWORD: "secret"
      MYSQL_ROOT_PASSWORD: "secret"
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - 4406:3306

  wp:
    build: 
      context: ./build
      dockerfile: Dockerfile
    image: wp-local
    restart: always
    depends_on: 
      - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: "wordpress"
      WORDPRESS_DB_USER: "wp"
      WORDPRESS_DB_PASSWORD: "secret"
      WORDPRESS_DEBUG: 1
      WORDPRESS_CONFIG_EXTRA: |
        define( 'WP_DEBUG_LOG', true );
        define( 'WP_DEBUG_DISPLAY', false );
        /* https://gist.github.com/dianjuar/1b2c43d38d76e68cf21971fc86eaac8e */
        define( 'FS_METHOD', 'direct' ); // Required to allow installing of plugins without the need for ftp access
    volumes:
      - ~/local_wp/wordpress:/var/www/html
    ports:
      - 8888:80

  phpmyadmin:
    image: phpmyadmin
    restart: always
    depends_on:
      - db
    ports:
      - 9999:80
    environment:
      MYSQL_USER: "wp"
      MYSQL_PASSWORD: "secret"
      MYSQL_ROOT_PASSWORD: "secret"

volumes:
  db_data:

注意:是的,我故意在wp服务中映射~/local_wp/wordpress而不是./wordpress ,因为我注意到如果我使用后者,它有点慢?我不知道为什么?它就像安装 wp 插件一样慢,如果我使用后者需要一分钟,但对于前者,它只需要 9-10 秒。


构建/Dockerfile

FROM wordpress:5.7.2-php7.4-apache

COPY ./php.ini /usr/local/etc/php/php.ini

# Install xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# Copy our xdebug.ini into the location the container's xdebug.ini
COPY ./xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

ENTRYPOINT ["docker-entrypoint.sh"]

CMD ["apache2-foreground"]

php.ini文件实际上只有我在这里复制的默认内容https://github.com/php/php-src/blob/master/php.ini-development 这里没什么特别的。


xdebug.ini

zend_extension=xdebug

[xdebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9000

同样,我似乎无法使步骤调试工作。我对 VS Code btw使用了php 调试扩展,并按照它的说明进行操作,但还是不行。

我也在WordPress的debug.log上得到了这个

[30-May-2021 02:34:11 UTC] Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: host.docker.internal:9000 (through xdebug.client_host/xdebug.client_port) :-(

我尝试在 docker-compose.yml 文件上公开端口 9000,但它不起作用。

我尝试从 xdebug.ini 中删除 xdebug.client_host = host.docker.internal,但它不起作用。

我尝试在 docker-compose.yml 文件上公开端口 9000、9001、9002、9003,因为我注意到有时它使用端口 9000,有时使用 9003,仍然无法正常工作。

任何帮助深表感谢。

提前致谢。

4

2 回答 2

0

php.ini 文件实际上只有我在这里复制的默认内容https://github.com/php/php-src/blob/master/php.ini-development,这里没什么特别的。

我建议不要这样做。只需将文件留空,然后放入您想要从默认值进行的更改。PHP 不需要填充php.ini文件。

我尝试在 docker-compose.yml 文件上公开端口 9000,但它不起作用。

在 docker-compose.yml 中暴露任何 Xdebug 端口都不起作用,因为是Xdebug建立了连接,而暴露的端口仅用于传入连接。

在这种情况下,它试图连接到host.docker.internal端口9000,但它不能。

我尝试在 docker-compose.yml 文件上公开端口 9000、9001、9002、9003,因为我注意到有时它使用端口 9000,有时使用 9003,仍然无法正常工作。

同样,暴露它不会做任何事情。确实,Xdebug 有时会默认使用 9000 或 9003 端口,第一个是 Xdebug 2 的默认值,第二个是 Xdebug 3 的默认值。但是您已配置xdebug.client_port为使用端口 9000,因此不会事情。

请确保 VS Code 配置也确实提到了端口 9000。

我尝试从 xdebug.ini 中删除 xdebug.client_host = host.docker.internal,但它不起作用。

Xdebug 需要知道要连接到哪个主机,并且该主机需要在同一个(docker 内部?)网络中可见和可联系。

host.docker.internal不适用于 Linux(这就是 WSL2)。您需要配置运行 IDE 的机器的真实 IP,或者,如果您正在运行足够新的 Docker 引擎 (20.10.x),您可以extra-hosts在服务中添加一个额外的条目wp

wp:
  …
  image: wp-local
  extra_hosts:
    - "host.docker.internal:host-gateway"
  …
于 2021-05-30T08:01:45.623 回答
0

我设法让它工作,但不确定有什么帮助。

修改 php.ini,如https://veselin.dev/blog/xdebug-3-in-docker只留下这 4 行用于 xdebug 就足够了。

它可以在 launch.json 中没有端口和主机名的情况下工作。

它可以在不暴露 9003 端口或为 php contaner 添加 extra_hosts 的情况下工作。

关闭所有防火墙。也许值得从头开始。其实你可能只是打开9000端口,但在windows上并不那么容易......

PS你总是可以通过从php图像ping你的实际IP来检查路由。

cd your/project/dir
docker-compose exec wp "bash" # wp is php container name. If bash didn't work use sh instead
apt-get update && apt-get install iputils-ping
ping 192.168.0.147 # your local ip goes here. It should be accessible

如果您甚至无法从调试服务器 ping 您的 PC,那么您将无法走得更远。

于 2021-09-27T21:18:12.610 回答