Настройка 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"
…