Xdebug відомий своїм складним налаштуванням. Проте я покажу вам, що інсталяція Xdebug може бути простою. Насправді, я впевнений, що ви зможете почати використовувати Xdebug із Docker приблизно за хвилину.
Добре, можливо, деяким із вас знадобиться кілька хвилин :)
Ми налаштуємо його в середовищі Laravel з PHP 8.4 та Xdebug v3.4.0, актуальними на момент написання.
Щоб настроїти Xdebug на Docker, нам знадобиться:
Dockerfile
, який встановлює модуль Xdebug і його конфігураціюcompose.yaml
для запуску контейнераУ цьому пості ми використаємо Apache для спрощення налаштування сервера, однак код Dockerfile буде ідентичний налаштуванню Xdebug у образі PHP-FPM.
Почнемо з налаштування демонстраційного проекту:
laravel new xdebug-demo --git --no-interaction
cd xdebug-demo
mkdir -p build/php/conf.d build/apache
touch compose.yaml \
build/Dockerfile \
build/php/conf.d/xdebug.ini \
build/apache/vhost.conf
Ми створили папки та файли через командний рядок, але ви можете зробити це на свій розсуд. Окрім звичних Docker-файлів, ми також створили файл vhost.conf
для налаштування кореневого веб-шляху нашого застосунку.
Далі додайте наступне до файлу build/Dockerfile
:
Dockerfile містить багато рядків, тож розглянемо найважливіший код, щоб допомогти вам зрозуміти, як налаштувати Xdebug. Спочатку ми використовуємо багатошарове будування, щоб налаштувати Xdebug у розробницьких середовищах. Перед етапом development
є етап base
, що містить базові налаштування, необхідні нашому образу, такі як PHP-розширення, котрі потрібні в будь-якому середовищі, та налаштування Apache.
На наступному етапі development
ми копіюємо версію файлу PHP.ini для розробки і конфігураційний файл xdebug.ini
, у якому зберігатимемо наші налаштування Xdebug. Ми використовуємо v3.4.0
, яка підтримує PHP 8.4 і є актуальною на момент написання.
Останній, app
, етап використовується нашим застосунком у виробничих налаштуваннях. Використання цільового етапу app
виключає налаштування Xdebug і використовує версію php.ini для виробництва.
Нам не потрібно навчатися, як налаштовувати Apache; ми просто хочемо швидко продемонструвати, як легко налаштувати Xdebug на Docker. Додайте наступний код до файлу build/apache/vhost.conf
, який копіюється в Docker-образ для вказівки на код застосунку:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /srv/app/public
<Directory "/srv/app/public">
AllowOverride all
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Далі потрібно налаштувати Xdebug через файл xdebug.ini
. Додайте наступне, якщо ви слідуєте інструкціям:
; build/php/conf.d/xdebug.ini file
[xdebug]
xdebug.mode = debug
xdebug.client_host = host.docker.internal
; Або використовуйте IP-адресу хоста:
; xdebug.client_host = 192.168.86.203
xdebug.start_with_request = yes
Ці налаштування потрібні для визначення клієнтського хоста. Оскільки ми використовуємо Docker-мережу, Xdebug має знати, як спілкуватися з нашим хост-комп'ютером. Якщо ви використовуєте Docker Desktop, Docker має хост host.docker.internal
, що вказує на ваш комп'ютер.
Якщо ні, вам потрібно знайти локальну IP-адресу вашого комп'ютера і використовувати її. Хоча ми могли б вказати цю інформацію через змінну середовища, я залишу це для наступного посту.
Також ми використовуємо xdebug.start_with_request = yes
, щоб Xdebug завжди активувався з кожним запитом. Ви можете вимкнути Xdebug через інтерфейс редактора, коли він не потрібен, але він завжди намагатиметься встановити з'єднання.
Перед перевіркою з'єднання Xdebug потрібно налаштувати контейнер застосунку. Ми скористаємося Docker Compose, щоб запустити наш застосунок, додавши наступне до compose.yaml
:
services:
app:
build:
context: .
dockerfile: build/Dockerfile
target: development
ports:
- "8080:80"
volumes:
- .:/srv/app
Наша служба app
націлена на етап development
нашого будування, монтує обсяг, щоб ми могли змінювати код без перебудови образу, і використовує порт 8080
для локальної подачі застосунку.
Тепер ми можемо побудувати та запустити наш образ за допомогою Docker Compose:
docker compose up --build -d
Ця команда створить образ, запустить контейнер і працюватиме у фоновому режимі. На цьому етапі Xdebug готовий приймати з'єднання, однак нам потрібно провести кілька налаштувань у IDE.
Ми будемо використовувати PhpStorm, але ви можете вибрати будь-який редактор, який підтримує Xdebug. Оскільки ми використовуємо Docker, потрібно налаштувати сервер у PhpStorm, що відображає обсяг Docker на код вашого локального проекту. Для цього відкрийте Налаштування > PHP > Сервери та налаштуйте сервер localhost з відображенням /srv/app
:
Якщо у вас немає сервера localhost, ви можете додати його на цій сторінці налаштувань, використовуючи порт 8080
і вибравши налагоджувач Xdebug
. Відображення сервера дозволяє нашому IDE зрозуміти, як співвіднести трасування стеку сервера з файлами в проекті.
Тепер ми готові активувати Xdebug, натиснувши на значок "Bug" у верхньому правому меню, який говорить "Почати прослуховування PHP Debug з'єднань" при наведенні на нього:
Коли ви на нього натискаєте, значок має стати зеленим.
Останнє, що потрібно зробити — це встановити точку зупинки. Відкрийте файл routes/web.php
та встановіть точку зупинки на єдиному рядку домашнього маршруту:
Якщо ви відкриєте свій проект у веб-браузері (localhost:8080), PhpStorm має запросити вас на з'єднання вперше. Після цього він автоматично зупиниться на будь-яких точках зупинки, які ви встановите. Коли ви закінчите відладку, можете натиснути на значок Bug, щоб відключити з'єднання Xdebug.
Тепер ви повинні мати можливість використовувати Xdebug з вашим проектом! Я також подав вам бонусну тему — використання багатошарових образів для налаштування інструментів розробки і окремого етапу для виробничих налаштувань. Використання багатошарових будівель дозволяє зробити ваші образи більш гнучкими.
Якщо у вас виникнуть труднощі з частиною налаштування Xdebug в редакторі, PhpStorm має детальну документацію про те, як налаштувати Xdebug. Документація Xdebug теж є чудовим джерелом, включаючи інформацію про налаштування, інструменти, параметри конфігурації та інше.