Pull to refresh

Comments 13

Поддерживаю. Рабочий вариант.

Этот кусок ставит 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

да,я забыл упомянуть, что я настраивал дебаггер для очень старого проекта

pecl 100% ставит вторую версию, потому что видит что в системе поставлен php5.6

спасибо за дополнение для третьей версии!

тогда, может, стоит сделать статью и для новых версий ? ;)

заманчивое предложение :D ночью доберусь - обновлю статью

готово! обновил статью и добавил конфиг для XDebug 3; тестировал на php8.2 - работает

спасибо. полезное дело сделали!

Спасибо тебе добрый человек, наконец то пересяду на докер с vagrant )

очень приятно слышать, дерзай!

@ddruganov

Добрый день! Что-то не выходит аленький цветочек. В 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 из контейнера.

Sign up to leave a comment.

Articles