Настройка XDebug 3 в среде разработки WordPress (Docker + WSL 2)

Я не могу заставить пошаговую отладку работать с XDebug 3 на WP Dev Env внутри Docker + WSL 2

Вот моя структура папок

Не обращайте внимания на references.txt файл, он не использовать здесь.

WordPress папка будет содержать все файлы WordPress. При запуске это пустая папка, но она будет заполнена файлами WordPress после настройки dev env с помощью docker-compose up.

Примечание: все эти файлы находятся в ubuntu 20.04, установленном через WSL 2.


файл 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:

Примечание: да, я намеренно сопоставил ~ / local_wp / wordpress вместо ./wordpress здесь, в службе wp, как я заметил, если я использовал более позднюю версию , это немного медленно? Я не знаю почему? Это медленно, как установка плагинов 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 для VS Code, кстати, и следил за его инструкциями, но все равно ничего хорошего.

Я также нашел это в debug.log WordPress

      [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) :-(

Я попытался открыть порт 9000 в файле docker-compose.yml, он не работает.

Я попытался удалить xdebug.client_host = host.docker.internal из xdebug.ini, это не работает.

Я попытался открыть порт 9000, 9001, 9002, 9003 в файле docker-compose.yml, поскольку я заметил, что иногда он использует порт 9000, иногда 9003, но все равно не работает.

Любая помощь очень ценится.

Заранее спасибо.

2 ответа

Мне удалось это сработать, но я не уверен, что помогло.

Измените php.ini, как в https://veselin.dev/blog/xdebug-3-in-docker, оставьте только эти 4 строки для xdebug, этого достаточно.

Он работает без портов и имен хостов в launch.json.

Он работает без раскрытия порта 9003 или добавления extra_hosts для php contaner.

Выключите весь брандмауэр. Может, с этого стоит начать. На самом деле вы можете просто открыть порт 9000, но в Windows это не так просто ...

PS Вы всегда можете проверить маршруты, выполнив pinging свой фактический ip из образа php.

      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

Если вы даже не можете пропинговать свой компьютер с сервера отладки, вы не сможете пойти дальше.

В файле php.ini действительно есть только содержимое по умолчанию, которое я скопировал здесь https://github.com/php/php-src/blob/master/php.ini-development , здесь ничего особенного.

Я бы посоветовал не делать этого. Просто оставьте файл пустым и внесите только те изменения, которые вы хотите внести по умолчанию. PHP не требует заполнения php.ini файл.

Я попытался открыть порт 9000 в файле docker-compose.yml, он не работает.

Предоставление любого порта Xdebug в docker-compose.yml не сработает, потому что это Xdebug, который устанавливает соединение, а открытые порты предназначены только для входящих соединений.

В этом случае он пытается подключиться к порту 9000, и не может.

Я попытался открыть порт 9000, 9001, 9002, 9003 в файле docker-compose.yml, поскольку я заметил, что иногда он использует порт 9000, иногда 9003, но все равно не работает.

Опять же, разоблачение ничего не даст. Это правда, что Xdebug иногда по умолчанию использует порт 9000 или порт 9003 , причем первый - по умолчанию для Xdebug 2, а второй - по умолчанию для Xdebug 3. Но вы настроили xdebug.client_port использовать порт 9000, так что это не имеет значения.

Убедитесь, что в конфигурациях VS Code также упоминается порт 9000.

Я попытался удалить xdebug.client_host = host.docker.internal из xdebug.ini, это не работает.

Xdebug должен знать, к какому хосту подключаться, и этот хост должен быть видимым и доступным для связи из той же (внутренней докеры?) Сети.

host.docker.internalне работает в Linux (что и есть WSL2). Вам нужно либо настроить реальный IP-адрес компьютера, на котором работает ваша IDE, либо, если вы используете достаточно новый Docker Engine (20.10.x), вы можете сделать дополнительный extra-hosts запись в вашем wp услуга:

      wp:
  …
  image: wp-local
  extra_hosts:
    - "host.docker.internal:host-gateway"
  …
Другие вопросы по тегам