Комментарии 14
Я в свое время так же долго мучался с подключением PHPStorm + XDebug + Docker.
Помогло видео от маинтейнера XDebug.
https://youtu.be/4opFac50Vwo
Этот кусок ставит
XDebug
через черезpecl
и закидывает нужные параметрыXDebug
в конфиг
У вас настройки для xDebug 2.*. Третья версия вышла два года назад.
Вы уверены, что pecl ставит именно вторую версию, и почему?
В третьей версии изменили наименования параметров, теперь конфиг будет выглядить примерно так:
RUN echo "zend_extension=xdebug.so" >> /etc/php81/conf.d/50_xdebug.ini && \
echo "xdebug.start_with_request = yes" >> /etc/php81/conf.d/50_xdebug.ini && \
echo "xdebug.idekey = awesome-x-debug" >> /etc/php81/conf.d/50_xdebug.ini && \
echo "xdebug.max_nesting_level = 1000" >> /etc/php81/conf.d/50_xdebug.ini && \
echo "xdebug.client_host = host.docker.internal" >> /etc/php81/conf.d/50_xdebug.ini && \
echo "xdebug.client_port = 9001" >> /etc/php81/conf.d/50_xdebug.ini && \
echo "xdebug.mode=debug" >> /etc/php81/conf.d/50_xdebug.ini
Спасибо тебе добрый человек, наконец то пересяду на докер с vagrant )
Добрый день! Что-то не выходит аленький цветочек. В Windows всё немного не так, но не суть.
Вот мой Dockerfile сделанный для опытов:
Hidden text
# Базовый образ PHP
FROM php:7.4-cli
# xdebug
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/bin/
RUN install-php-extensions xdebug
ENV PHP_IDE_CONFIG='serverName=dtest'
RUN echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.start_with_request = yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.client_port=9001" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.log=/var/log/xdebug.log" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.idekey = PHPSTORM" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# Установка рабочего каталога
WORKDIR /var/www/html
# Запуск скрипта PHP со встроенным сервером
CMD ["php", "-S", "0.0.0.0:8080"]
Он просто запускает сервер PHP.
Для версии PHP 7.4 подходит xdebug версии 3. Поэтому добавил в Dockerfile его.
docker-compose.yml выглядит вот так:
Hidden text
services:
web:
build: .
ports:
- "8080:8080"
- "9001:9001"
volumes:
- .:/var/www/html
extra_hosts:
- "host.docker.internal:host-gateway"
Контейнер собирается, запускается, работает. В корень проекта я положил index.php с вызовом phpinfo(); Видно, что xdebug подключён.
Hidden text

Сервер добавлен
Hidden text

Удалённая отладка добавлена:
Hidden text

Запускаю контейнер:
Hidden text

Контейнер успешно стартует. По адресу на хосте localhost:8080 открывается страничка.
Захожу в контейнер. Смотрю лог xdebug
Hidden text
[1] Log opened at 2024-08-07 16:20:12.945517
[1] [Step Debug] INFO: Connecting to configured address/port: host.docker.internal:9001.
[1] [Step Debug] INFO: Connected to debugging client: host.docker.internal:9001 (through xdebug.client_host/xdebug.client_port). :-)
[1] [Step Debug] ->
[1] [Step Debug] ->
[1] Log closed at 2024-08-07 16:20:12.952640
Видно, что xdebug обращается к хосту без проблем. Дело осталось за малым, чтобы PHPStorm принял данные от xdebug.
Запускаю удалённую отладку:
Hidden text

Получаю ошибку: Port 9001 is busy.
Пытаюсь выяснить, кто же его занял: netstat -ano | findstr :9001 и вижу, что его занял PHPStorm ранее запущенным контейнером.
Что я делаю не так?
Сам спросил, сам отвечу: не надо пробрасывать порт от xdebug из контейнера.
Запилил подробнейший туториал.
PHPStorm + XDebug + Docker