微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 WordPress Dev Env 中设置 XDebug 3 (Docker + WSL 2)

如何解决在 WordPress Dev Env 中设置 XDebug 3 (Docker + WSL 2)

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

这是我的文件夹结构

enter image description here

忽略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

我似乎再次无法使步骤调试工作。顺便说一句,我将 php debug extension 用于 VS Code 并按照其说明进行操作,但还是不行。

我也在 wordpressdebug.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,但仍然不起作用。

非常感谢任何帮助。

提前致谢。

解决方法

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 的默认值。但是您已经配置了 {{1 }} 使用端口 9000,所以没关系。

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

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

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

xdebug.client_port 在 Linux 上不起作用(这就是 WSL2)。您要么需要配置运行 IDE 的机器的真实 IP,或者,如果您运行的是足够新的 Docker 引擎 (20.10.x),则可以在 {{ 1}} 服务:

host.docker.internal

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?