【问题标题】:Setup XDebug 3 In WordPress Dev Env (Docker + WSL 2)在 WordPress 开发环境中设置 XDebug 3 (Docker + WSL 2)
【发布时间】:2021-05-30 03:00:28
【问题描述】:

我无法在 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 中使用了 php debug extension 并按照它的说明进行操作,但还是不行。

我也在 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,但仍然无法正常工作。

非常感谢任何帮助。

提前致谢。

【问题讨论】:

  • 根据我对这个问题的额外研究,它似乎涉及允许到 wsl2 中 linux 发行版的端口 9000 的向内连接,但是目前,ufw 在 wsl 2 中与 linux 发行版存在一些问题stackoverflow.com/questions/66018516/wsl2-cannot-enable-ufw所以这似乎是一个死胡同? (适用于 Windows 用户)

标签: docker xdebug windows-subsystem-for-linux wsl-2 xdebug-3


【解决方案1】:

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 建立了连接,而暴露的端口仅用于传入连接。

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

我尝试在 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),您可以在 wp 服务中添加一个额外的 extra-hosts 条目:

wp:
  …
  image: wp-local
  extra_hosts:
    - "host.docker.internal:host-gateway"
  …

【讨论】:

  • 试过你的建议,还是没能成功。它确实在 debug.log 文件中显示了这一点。 Xdebug:[Step Debug] 无法连接到调试客户端。试过:localhost:9000(通过 xdebug.client_host/xdebug.client_port):-(。那是在 docker-compose.yml 文件上使用 extra_hosts,是的,我在 Docker 20.10.6
  • 关于这个"你要么需要配置你的IDE所在机器的真实IP"你的意思是主机操作系统的ip或者ubuntu的ip wsl2?
  • 当我在 xdebug.ini 文件中重新添加 xdebug.client_host = host.docker.internal 时,extra_hosts 出现调试错误.log 是 Xdebug: [Step Debug] 连接到调试客户端超时,等待:200 毫秒。试过:host.docker.internal:9000(通过xdebug.client_host/xdebug.client_port):-(
  • 顺便说一句,这是vscode的launch.json gist.github.com/Jplus2/cac395e322ec3cff69e2cfab64dc823a
【解决方案2】:

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

https://veselin.dev/blog/xdebug-3-in-docker那样修改php.ini,只留下这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,那么您将无法更进一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多