Настройка Xdebug на виртуальной машине, удаленном сервере и в Docker контейнере

Тонкая настройка Xdebug

Привет, товарищи разработчики! Сегодняшний пост будет полезен всем PHP-разработчикам, так как речь пойдет о настройке такого инструмента отладки, как Xdebug. В рамках данного поста я расскажу как запустить Xdebug на виртуалке, на удаленном сервере через SSH-туннель и даже внутри Docker контейнера.

Тот кто внимательно следит за блогом скажет, что мол была уже запись про отладку кода в PhpStorm с использованием Xdebug и сколько можно об этом писать. Да, об этом писал и по-прежнему рекомендую пост к прочтению, если хотите разобраться в самом процессе отладки кода. Этот же пост нацелен на более нетривиальные задачи по настройке Xdebug.

В отличие от предыдущего поста сегодняшнюю настройку Xdebug мы будем производить уже без использования OpenServer, от которого я кстати рекомендую отказаться, если вы считаете себя более ли менее продвинутым разработчиком. Для продвинутых разработчиков нынче в тренде Linux. Что касается меня, то я так и не решился перейти полностью на Linux — использую по-старинке Windows 7 и серверную Ubuntu 14.04, запущенную на виртуалке средствами VirtualBox. Не могу сказать, что проще: перейти полностью на Linux или остаться на Windows, но с виртуальным Linux и кучей головняка по синхронизации файлов. По своему опыту могу сказать, что за полгода-год удается, как правило, решить все проблемы связки Windows + Linux и работать без особых проблем.

Собственно, к чем был предыдущий абзац — к тому, что сегодняшняя лекция по настройке Xdebug будет полезна прежде всего тем, кто, как и я, использует Windows в качестве основной системы и Linux в качестве оси на виртуалке. Хотя закоренелые пользователи Linux может тоже найдут, что-нибудь полезное.

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

  • Ubuntu 14.04
  • PHP 5.5.9
  • Apache 2.4.7

Установка Xdebug на сервер

Надеюсь, у вас уже есть сервер, на котором установлен как минимум PHP. Для установки Xdebug на Ubuntu или Debian вам понадобится всего несколько команд:

  1. sudo apt-get update
  2. sudo apt-get install php5-xdebug

Ну вот, Xdebug должен быть успешно установлен. Осталось только его настроить — для этого необходимо создать .ini-файл с нужными параметрами и положить в директорию, с которой PHP зачитывает конфиги. В моем случае — это /etc/php5/mods-available/.

Создаем файл xdebug.ini:

  1. sudoedit /etc/php5/mods-available/xdebug.ini

Пишем следующее:

  1. zend_extension = xdebug.so

Сохраняем файл (CTRL + X) и перезапускаем веб-сервер, чтобы применить настройки:

  1. sudo php5enmod xdebug
  2. sudo service apache2 restart

Это еще не конечная настройка Xdebug, но на данном этапе мы уже сможем проверить подхватывает ли PHP наши настройки. Для этого воспользуйтесь либо консольной командой php -i | grep "xdebug", либо php-файлом с функцией phpinfo(); на одном из сайтов, расположенных на вашем сервере.

Установка Xdebug на Ubuntu и Debian

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

Настройка Xdebug на виртуалке (VirtualBox)

Следующим шагом будет настройка как Xdebug, так и PhpStorm для отладки web-приложения, которое запускается с вашего виртуального сервера. Другими словами: у вас есть сайт на Drupal и вы хотите заняться отладкой кода, запуская сайт через любимый браузер.

Конфиг для xdebug.ini:

  1. zend_extension=xdebug.so
  2. [xdebug]
  3. xdebug.remote_enable = 1
  4. xdebug.remote_connect_back = 1
  5. xdebug.idekey = "PHPSTORM"
  6. xdebug.remote_port = 9000
  7. xdebug.var_display_max_data = 2048
  8. xdebug.var_display_max_depth = 128
  9. xdebug.max_nesting_level = 500

И не забывайте делать рестарт вашего web-сервера после каждого изменения xdebug.ini.

  1. sudo service apache2 restart

Из важных настроек:

  • xdebug.remote_connect_back — если данный параметр активен, то Xdebug пытается подключиться к клиенту, которым был совершен HTTP запрос. Данная настройка удобная если вы не хотите указывать фиксированный IP-адрес.

Теперь необходимо настроить наш IDE — PhpStorm. По умолчанию PhpStorm слушает 9000 порт, однако это можно изменить где-то глубоко в настройках. В настройках Run/Debug Configurations добавляем PHP Web Application и конфигурируем, как показано на скриншотах.

Настройка PhpStorm для отладки Настройка PhpStorm и Xdebug

В качестве Host указываем локальное доменное имя вашего приложения. Сразу хочу оговориться про "8080" порт — это специфика моей виртуалки, у вас все может быть по-другому. Не забудьте настроить маппинг — крайне важно! Собственно, через маппинг вы указываете соответствие между файлами, которые лежат на вашей основной системе (Windows), и файлами, которые лежат на виртуальном сервере (Linux).

Если все настроили верно, то после запуска отладки (клик по зеленому "жуку" или Shift + F9) вас должно перебросить в браузер, где будет открываться сайт по URL вида: http://www.nvidia.loc:8080/?XDEBUG_SESSION_START=10261. На этом настройка закончена, можете смело переходить к отладке, которая уже описана в другой заметке.

Кстати, если вам необходимо остановить работу Xdebug, то добавьте параметр ?XDEBUG_SESSION_STOP к запрашиваемой странице. Многие ошибочно полагают, что можно остановить отладчик через PhpStorm, но это не всегда срабатывает. Поэтому, если у вас есть подозрение, что сайт завис и не открывается из-за Xdebug — попробуйте воспользоваться этим советом.

Настройка Xdebug для отладки PHP-CLI скриптов

Представьте, что вам необходимо заняться отладкой скриптов, которые хоть и написаны на PHP, но запускаются через консоль — через так называемый PHP-CLI. Мне приходилось с этим сталкиваться при работе с RabbitMQ и CodeCeption. Для настройки я рекомендую создать какой-нибудь тестовый php-скрипт (например, test.php с парой математических выражений и ответом, который выводится через "echo") и положить его в проект (на сервере и на Windows). Убедитесь, что скрипт работает запустив его:

  1. php test.php

Конфиг для xdebug.ini:

  1. zend_extension = xdebug.so
  2. [xdebug]
  3. xdebug.remote_enable = 1
  4. xdebug.remote_autostart = 1
  5. xdebug.remote_host = 192.168.56.1
  6. xdebug.idekey = "PHPSTORM"
  7. xdebug.remote_port = 9000
  8. xdebug.var_display_max_data = 2048
  9. xdebug.var_display_max_depth = 128
  10. xdebug.max_nesting_level = 500

Главное отличие от выше предложенных настроек — это то, что xdebug.remote_connect_back отсутствует по причине того, что при запуске скрипта через консоль отсутствует переменная $_SERVER['REMOTE_ADDR'], которая содержит IP-адрес клиента, по которому Xdebug пытается подключиться. Поэтому мы должны использовать фиксированный IP-адрес. Если вы используете VirtualBox, то этот IP-адрес будет, как правило, "192.168.56.1".

Настройки для PhpStorm можно оставить прежними. Однако потребуется сделать еще один финт ушами на стороне сервера, чтобы отладка кода проходила как по маслу. Дело в том, что с текущими настройками Xdebug ломится на 9000 порт, но не понимает какую схему для маппинга использовать. Поэтому в командной строке сервера пишем следующую команду:

  1. export PHP_IDE_CONFIG="serverName=MyServ"

Обратите внимание, что "MyServ" — это имя Server'a, которое мы указали при настройке отладчика в PhpStorm. Кстати, чтобы каждый раз не прописывать эту команду при подключении к вашему серверу, можете поместить ее в ~/.bashrc файл.

Далее в PhpStorm активируйте режим "Start Listening for PHP Debug Connections", установите Breakpoint и запустите php-скрипт в консольном окне.

Отладка PHP-CLI скриптов с Xdebug

Если вам необходимо отключить отладчик — просто отключите режим прослушивания PHP Debug подключений, кликнув по той же самой кнопке.

На самом деле вы можете использовать предложенный в этой главе конфиг xdebug.ini и для отладки тех же Web-приложений. Я просто хотел объяснить суть параметра xdebug.remote_connect_back на примерах, поэтому привел разные конфиги для двух глав.

Настройка Xdebug для удаленного сервера

Представьте ситуацию, что у вас есть удаленный сервер, на котором крутится сайт и вы хотите подлезть к нему с отладчиком. Основная проблема заключается в том, что скорее всего вы используете общий IP-адрес для выхода в интернет, что не позволит вам работать с Xdebug напрямую. Да, ситуация нестандартная, но не стоит отчаиваться: решение есть и имя ему SSH-туннель. Если не знаете, что это такое, то рекомендую задать следующие вопросы Google: "ssh туннель", "проброс портов" или же "ssh port forwarding". Если в двух словах, то мы создадим подключение, которое пробросит 9000 порт от сервера на 9000 порт хостовой системы, через который уже работает PhpStorm.

Если ваша хостовая система Windows, как и у меня, то скорее всего придется использовать тулзу PuTTy, которую вы уже должны были установить, если читали мой пост про настройку среды для разработчика Drupal проектов. Опять же, я не буду вдаваться в подробности, как настроить стандартное подключение через PuTTy — я думаю, что люди, которые хоть раз работали с удаленным сервером, знают как это делается. Проброс 9000 порта описан в следующем скрине:

PuTTy - проброс портов через SSH-туннель

Т.е. вы берете сохраненное подключение и всего лишь модифицируете указанным образом. Теперь при каждом подключении к серверу через PuTTy у вас будет осуществляться проброс 9000 порта, что позволит вам решить проблему общего IP-адреса.

Конфиг для xdebug.ini для удаленного сервера:

  1. zend_extension = xdebug.so
  2. [xdebug]
  3. xdebug.remote_enable = 1
  4. xdebug.remote_host = 127.0.0.1
  5. xdebug.idekey = "PHPSTORM"
  6. xdebug.remote_port = 9000
  7. xdebug.var_display_max_data = 2048
  8. xdebug.var_display_max_depth = 128
  9. xdebug.max_nesting_level = 500

Что касается настроек PhpStorm, то вам придется создать новый PHP Web Application и новый Server по аналогии с настройкой отладчика для виртуалки. Не забудьте настроить верный маппинг для файлов!

Настройка Xdebug в Docker контейнере

Пожалуй, это была самая интересная задача, связанная с настройкой Xdebug, на моей памяти. Что такое Docker я опять же в рамках этой статьи рассказывать не буду, но скажу, что Docker — это клевая штука, и думаю, что в ближайшие годы многие с ней столкнуться. Пусть эта глава будет бонусом для тех, кто более ли менее уже щупал в руках Docker и хочет настроить собственный Docker Image для разработки.

Настраивать Xdebug придется в том же контейнере, где крутится PHP и Web-сервер. Для примера я набросаю более ли менее рабочий вариант Dockerfile, в основу которого положен PHP Official образ.

Первым подводным камнем является тот момент, что придется тянуть OpenSSH в контейнер — без этого вы просто не сможете настроить удаленное подключение для проброса 9000 порта. Вторым камнем будет проблема с запуском нескольких бэкграунд процессов в контейнере: первый процесс — это Apache, второй — притянутый нами OpenSSH. Дело в том, что Docker запускает только один процесс, указанный через CMD в Dockerfile — с этим я в своем время провозился больше всего. Решением проблемы запуска нескольких бэкграунд процессов в контейнере является Supervisor.

В общем, представляю вашему вниманию пример Dockerfile, который позволит вам использовать Xdebug в Docker контейнере на удаленном сервере:

  1. FROM php:5.6-apache
  2.  
  3. # supervisor installation
  4. RUN apt-get update && apt-get -y install supervisor && \
  5. mkdir -p /var/log/supervisor && \
  6. mkdir -p /etc/supervisor/conf.d
  7.  
  8. # openssh installation
  9. RUN apt-get update && apt-get install -y openssh-server
  10. RUN mkdir /var/run/sshd
  11. COPY docker/sshd_config /etc/ssh/sshd_config
  12.  
  13. # создаем пользователя dev, которого будем использовать
  14. # для удаленного ssh-подключения к контейнеру
  15. RUN adduser dev --disabled-password --gecos ""
  16. RUN usermod -aG www-data dev
  17.  
  18. # копируем authorized_keys из хостовой системы
  19. # для авторизации по ssh-ключу
  20. RUN mkdir /home/dev/.ssh
  21. COPY docker/authorized_keys /home/dev/.ssh/authorized_keys
  22. RUN chmod 700 /home/dev/.ssh
  23. RUN chmod 600 /home/dev/.ssh/authorized_keys
  24. RUN chown -R dev:dev /home/dev/.ssh
  25.  
  26. EXPOSE 22
  27.  
  28. # xdebug installation
  29. RUN pecl install xdebug
  30. COPY docker/ext-xdebug.ini /usr/local/etc/php/conf.d/
  31.  
  32. COPY docker/supervisor.conf /etc/supervisor/conf.d/supervisord.conf
  33.  
  34. WORKDIR /var/www/html
  35.  
  36. CMD ["/usr/bin/supervisord"]

Содержимое для supervisor.conf:

  1. [supervisord]
  2. nodaemon=true
  3.  
  4. [program:apache2]
  5. command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
  6.  
  7. [program:sshd]
  8. command=/usr/sbin/sshd -D

Ну и собственно bash-скрипт, который соберет вам контейнер:

  1. #!/bin/bash
  2.  
  3. # копируем файлы, которые помогут поднять OpenSSH в конетейнере с настройками,
  4. # аналогичными настройкам хостовой системы
  5. cp ~/.ssh/authorized_keys ./docker
  6. cp /etc/ssh/sshd_config ./docker
  7. docker build -t angarsky-dev .
  8. docker run -it --name angarsky-dev -v PATH_TO_SITE_FILES:/var/www/html -p 80:80 -p PORT_FOR_EXAMPLE_32777:22 -d angarsky-dev
  9. rm ./docker/authorized_keys ./docker/sshd_config

Я не обещаю, что контейнер с предложенным мною конфигом сразу же у вас заведется. Скорее всего вам придется потратить какое-то время, чтобы разобраться и допилить его под свои нужды. После того, как контейнер заведется проверьте подхватился ли Xdebug и попробуйте настроить SSH подключение: в качестве пользователя используйте "dev", в качестве хоста — IP-адрес сервера, в качестве порта — выбранный порт при запуске контейнера (32777 из примера). Если у вас получилось подключиться — добавьте в подключение проброс порта и можете приступать к отладке!

На самом деле я думаю сделать отдельную статью о том, как с помощью Docker'a настроить среду для разработки. Поэтому сейчас, пожалуй, не буду вдаваться в подробности его использования. Надеюсь, предоставленных данных будет достаточно для настройки Xdebug тем, кто уже имеет опыт работы с Docker'ом.

Ну вот, вроде изложил все свои нынешние знания по настройке Xdebug. Можете добавлять страницу в закладки — будет отличной шпаргалкой на будущее! Если есть вопросы — задавайте. Если кому-то поможет моя статья можете оставить "Спасибо" в качестве фидбека.

Комментарии

Аватар пользователя Прохожий
Прохожий

vagrant рулит

Аватар пользователя Alex Danilenko
Alex Danilenko

https://github.com/blinkreaction/drude - xdebug работает из коробки

Аватар пользователя Ramin Popygaev
Ramin Popygaev

К сожалению, сборка с пафосным названием Vagrant Drupal Development не содержит в себе настроенного xdebug из коробки. Пришлось устанавливать самостоятельно, и, к моему глубочайшему везению под руку попался этот пост. Надо будет попробовать еще drupalvm.com - судя по описанию там ВСЁЕСТЬ.

Аватар пользователя zhukoff
zhukoff

Хоть один человек понятно объяснил)))

Аватар пользователя Ivan
Ivan

Пригодилась статья, благодарю

Аватар пользователя Tester
Tester

Лучшая статья на настройке xdebug, каждый раз когда настраиваю, использую ее! Спасибо!

Добавить комментарий

  .d88888b.   d8b            888888888  
d88P" "Y88b Y8P 888
888 888 888
888 888 888 888 888 8888888b.
888 888 888 `Y8bd8P' "Y88b
888 Y8b 888 888 X88K 888
Y88b.Y8b88P 888 .d8""8b. Y88b d88P
"Y888888" 888 888 888 "Y8888P"
Y8b

Зарегистрируйтесь для добавления материалов без проверки.