Pecl install xdebug docker php ext enable xdebug

Настройка Xdebug 3 на внешнем сервере в Docker-контейнере через SSH-туннель

В нашей организации используется такой подход к разработке — на локальной машине (Windows 11) установлен PhpStorm и находится репозиторий с кодом. В PhpStorm настроена автоматическая выгрузка изменений на dev-стенд (внешний сервер), где и исполняется код. На dev-стенде: Ubuntu 20 и Docker (swarm mode).

Общий принцип настройки Xdebug таков:

  • Открываем SSH-туннель между локальной машиной и dev-стендом
  • Xdebug из контейнера подключается к 9003-му порту хоста (dev-стенд)
  • dev-стенд по SSH-туннелю перенаправляет запрос на 9003-й порт локальной машины

1. Настройка на стороне внешнего сервера:

1.1. Добавить Xdebug в образ

В Dockerfile , из которого собирается Ваш образ PHP-FPM необходимо добавить установку и активацию XDebug 3:

FROM php:8.0.6-fpm-alpine RUN apk add --no-cache \ $PHPIZE_DEPS \ && pecl install xdebug \ && docker-php-ext-enable xdebug

1.2. Определить IP адрес, по которому хост доступен из контейнера

Для этого нужно выполнить в нем команду:

docker exec $(docker ps -q --filter="NAME=php-fpm") \ /sbin/ip route|awk '/default/ < print $3 >'

php-fpm — это название сервиса PHP-FPM, указанное в compose-файле.

Получим IP, который будем далее указывать в настройках Xdebug и правилах перенаправления пакетов.

1.3. Настройка Xdebug в php.ini

[X-debug] xdebug.mode=debug xdebug.client_host=172.18.0.1 xdebug.client_port=9003

В опции xdebug.client_host указан IP, полученный на шаге 1.2

1.4. Правки docker-compose.yml

Для сервиса php-fpm необходимо добавить переменную окружения PHP_IDE_CONFIG с названием сервера, в котором в PhpStorm будет задан маппинг. Docker — это название сервера в настройках PhpStorm (Шаг 2.2).

version: "3.9" services: ### php-fpm ########################################################### php-fpm: image: $ environment: PHP_IDE_CONFIG: serverName=Docker

1.5. Переадресация трафика на внешний порт

sudo iptables -t nat -I PREROUTING -p tcp -d 172.18.0.1 \ --dport 9003 -j DNAT --to 127.0.0.1:9003

172.18.0.1 — это адрес, по которому можно обратиться к хост-машине из контейнера (пункт 1.2).

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

sudo apt-get install iptables-persistent

В процессе установки будет предложено сохранить все правила для IPv4. Ответить нужно положительно.

2. Настройка на стороне локальной машины:

2.1. Открыть SSH-туннель

Вы должны иметь возможность подключения к внешнему серверу по SSH.

Запустите SSH-туннель с проброской 9003-го порта внешнего сервера на 9003-й порт локального хоста:

ssh -R :localhost: @ # например ssh -R 9003:localhost:9003 my-user@example.com

my-user — это имя вашего пользователя на внешнем сервер

example.com — это адрес внешнего сервера

2.2. Настройка PhpStorm

В настройках PHP -> Servers добавить сервер под названием Docker . Хост и порт не важны, можно оставить localhost и 80-й порт.
Главное — задать маппинг от корня локального проекта до корня проекта в контейнере на внешнем сервере

3. Использование

3.1. Включить «прослушку» порта 9003 в PhpStorm:

3.2. Инициализация отладки через браузер

Необходимо установить специальное расширение Xdebug Helper для вашего браузера, которое позволит легко запускать режим отладки.

В PhpStorm установите в нужном месте точку останова и перезагрузите страницу.

После этого должно произойти подключение к PhpStorm и начаться сессия отладки.

3.3. Инициализация откладки консольных команд.

Необходимо в команду добавить опцию -dxdebug.start_with_request=yes

Например,
php -dxdebug.start_with_request=yes bin/phpunit

4.Отладка подключения

Если подключение к PHPStorm не происходит, то можно воспользоваться легковесным клиентом для проверки подключения — https://xdebug.org/docs/dbgpClient

Его нужно скачать на локальный хост.

Запустить сначала на локальном хосте и попытаться подключиться к нему из контейнера:
curl -Iv 172.18.0.1:9003

Если в терминале с клиентом появилась надпись Connect from 127.0.0.1:xxxxx , то X-debug успешно соединяется с клиентом и проблема в настройках PHPStorm.

Источник

Настройка Xdebug3 для Laravel-приложения в Docker

В файле docker-compose.yml содержится информация про все наши сервисы:

version: "3.7" services: php: build: args: uname: $ uid: $ gid: $ context: ./services/php container_name: $_php image: $_php restart: unless-stopped working_dir: /var/www/ volumes: - ./services/php/php.ini:/usr/local/etc/php/php.ini - ../:/var/www environment: COMPOSER_MEMORY_LIMIT: 2G XDEBUG_CONFIG: client_host=$ client_port=$ remote_enable=1 PHP_IDE_CONFIG: serverName=$ networks: - main_network depends_on: - db db: image: mysql:5.6 restart: unless-stopped container_name: $_db command: --default-authentication-plugin=mysql_native_password environment: MYSQL_DATABASE: $ MYSQL_ROOT_PASSWORD: $ MYSQL_PASSWORD: $ MYSQL_USER: $ ports: - $:3306 volumes: - ./services/database/dump:/var/lib/mysql networks: - main_network nginx: image: nginx:1.17-alpine restart: unless-stopped container_name: $_nginx ports: - $:80 volumes: - ../:/var/www - ./services/nginx:/etc/nginx/conf.d networks: - main_network depends_on: - php networks: main_network: driver: bridge name: $_main_network ipam: driver: default config: - subnet: $/$

Из важного здесь стоит отметить ./services/php/php.ini:/usr/local/etc/php/php.ini — наш локальный файл php.ini (там некоторые конфиги дебаггера) будет намаплен на тот что внутри контейнера. XDEBUG_CONFIG — будет задана переменная окружения внутри контейнера php , которую потом будет испльзовать xdebug вместо значений по-умолчанию. Здесь мы задаем client_host — хост, к которому xdebug будет пытаться подключиться при инициации отладочного соединения. Этот адрес должен быть адресом машины, на которой ваш PhpStorm прослушивает входящие отладочные соединения. Получается так, что наша локальная машина находится в одной подсети с запущеными контейнерами, а её адресс будет первым в этой подсети. Таким образом, мы всегда можем знать каким будет адресс нашей машины, и позже зададим это значение в переменную XDEBUG_REMOTE_HOST . В CLIENT_PORT нужно будет задать порт, установленный на прослушивание в IDE (9003). XDEBUG_STORM_SERVER_NAME — имя сервера, который мы создадим в IDE позже. Этот параметр нужен, чтобы сообщить PhpStorm, как сопоставлять пути при подключении с докера (ведь у вас же открыты локальные файлы в редакторе, а код работает на удалённых; хотя при испльзовании volumes это не совсем так).

Вот, как выглядит файл окружения .env :

PROJECT_NAME=my_project DB_DATABASE=my_project_db DB_USERNAME=my_project DB_PASSWORD=p@$$w0rd DB_ROOT_PASSWORD=toor PHP_UNAME=dev PHP_UID=1000 PHP_GID=1000 DB_LOCAL_PORT=3377 NGINX_LOCAL_PORT=8077 XDEBUG_STORM_SERVER_NAME=Docker XDEBUG_REMOTE_HOST=192.168.227.1 XDEBUG_STORM_PORT=9003 SUBNET_IP=192.168.227.0 SUBNET_MASK=28 

На счёт подсети для проекта, то здесь мы задали 192.168.227.0 с маской 28, то-есть для всех устройств остаётся 32 — 28 = 4 бита , что равносильно 2 ** 4 — 1 = 15 контейнеров . Не 16 потому что в подсеть входит также наша локальная машина, которая, кстати, будет иметь адресс 192.168.227.1 . Именно это значение мы задали в переменную XDEBUG_REMOTE_HOST .

Настройки веб-сервера site.conf :

В нашем Dockerfile (тот что для php) нужно не забыть установить и включить xdebug. Для этого добавляем 2 строчки:

RUN pecl install xdebug RUN docker-php-ext-enable xdebug

Стоит отметить, что будет испльзована последняя (то-есть 3) версия (есть различия в конфигурации по сравнению с 2).

FROM php:7.4-fpm # Arguments defined in docker-compose.yml ARG uname ARG gid ARG uid # Install system dependencies RUN apt-get update \ && apt-get install -y \ git \ curl \ dpkg-dev \ libpng-dev \ libjpeg-dev \ libonig-dev \ libxml2-dev \ libpq-dev \ libzip-dev \ zip \ unzip \ cron RUN pecl install xdebug RUN docker-php-ext-enable xdebug RUN docker-php-ext-configure gd \ --enable-gd \ --with-jpeg ADD ./php.ini /usr/local/etc/php/php.ini # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install PHP extensions RUN docker-php-ext-install pdo pdo_mysql pdo_pgsql pgsql mbstring exif pcntl bcmath gd sockets zip # Get latest Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Create system user to run Composer and Artisan Commands RUN groupadd --gid $gid $uname RUN useradd -G www-data,root -s /bin/bash --uid $uid --gid $gid $uname RUN mkdir -p /home/$uname/.composer && \ chown -R $uname:$uname /home/$uname # Set working directory WORKDIR /var/www USER $uname # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"] 

Также, зададим некоторые параметры исплнения в php.ini :

max_execution_time=1000 max_input_time=1000 xdebug.mode=debug xdebug.log="/var/www/xdebug.log" xdebug.remote_enable=1

И дальше пойдём в PhpStorm для настройки:

Создадим сервер с названием Docker и cделаем маппинг локального корня проекта ( /var/www/quizzy.loc ) на путь, по которому он лежит в докере ( /var/www ):

Дальше, нам нужно будет настроить использование интерпретатора php из докера:

Настраиваем php interpreterВыбираем сервис, в котором находится php и указываем путь к интерпретаторуЗадаём параметры запуска (через exec)

Теперь можем перейти в подпункт «Debug» и настроить порт на котором запускать:

Настраиваем дебаггер

Проверим, работает ли Xdebug:

Теперь можем поставить брейкпоинт в нашем коде и начать прослушивание входящих подключений:

Переходим в наш любимый браузер Firefox, устанавливаем и включаем плагин на нужной странице:

Перезагружаем страницу, и в PhpStrom должен поймать подключение:

Источник

Дебажим PHP-контейнер с помощью Xdebug и PhpStorm


Инструкция Docker #9: xdebug

Я создам очень простую php-страницу и подебажу ее с помощью xdebug и PhpStorm.

Исходные файлы можно найти здесь:
github.com/ikknd/docker-study в папке recipe-09

1. Создайте файл «Dockerfile» в папке «docker»:

FROM php:7.2-fpm #Install xdebug RUN pecl install xdebug-2.6.1 && docker-php-ext-enable xdebug CMD ["php-fpm"]

Выполните эту команду из папки docker для создания образа:

docker build -t php-xdebug-custom -f Dockerfile .

2. Создайте файл docker-compose.yml в папке «docker»:

version: "3.7" services: web: image: nginx:1.17 ports: - 80:80 volumes: - /var/www/docker-study.loc/recipe-09/php:/var/www/myapp - /var/www/docker-study.loc/recipe-09/docker/site.conf:/etc/nginx/conf.d/site.conf depends_on: - php php: image: php-xdebug-custom volumes: - /var/www/docker-study.loc/recipe-09/php:/var/www/myapp - /var/www/docker-study.loc/recipe-09/docker/php.ini:/usr/local/etc/php/php.ini

Здесь я использую образ «php-xdebug-custom» вместо «php:7.2-fpm „

3. Внесите в файл php.ini следующие настройки:

[xdebug] zend_extension=xdebug.so xdebug.profiler_enable=1 xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=host.docker.internal xdebug.remote_port=9000 xdebug.remote_autostart=1 xdebug.remote_connect_back=1 xdebug.idekey=PHPSTORM

4. Настройте сервер в PhpStorm:

File -> Settings -> Languages и Frameworks -> PHP -> Servers
Добавьте новый сервер с помощью иконки + и настройте его, как показано на следующем скриншоте:

Убедитесь, что вы отметили «Использовать сопоставление путей» (“Use path mappings») и сопоставили папку php с /var/www/myapp .

5. Настройте удаленный дебагер PHP в PhpStorm:

Run -> Edit configurations -> PHP Remote Debug

Добавьте новую конфигурацию и присвойте ей значения, как на следующем скриншоте:

6. Выберите конфигурацию дебага на панели дебага PhpStorm

7. Перейдите в /var/www/docker-study.loc/recipe-09/docker/ и выполните:

Если я сейчас введу myapp.loc/ в браузере, я увижу результаты из файла index.php .

Я могу установить точку останова, начать прослушивание соединений в панели дебага PhpStorm и перезагрузить страницу.

Еще по теме

Источник

Читайте также:  Php удалить все html символы
Оцените статью