Удаленная отладка с использованием xdebug port forwarding

Каждый разработчик время от времени сталкивается с непонятными ошибками. Как правило, их причина неочевидна и чтобы их пофиксить, нужно детально понять, что происходит в коде. Модуль xdebug — инструмент для профессионального поиска ошибок. Когда выполнение кода доходит до точки останова, xdebug присоединяется к IDE, которая слушает порт (по умолчанию 9000). Эта схема хорошо работает на localhost. Если вы находитесь в прямой видимости удаленного сервера, то можно прописать в конфиге xdebug ваш ip, и производить отладку аналогично. Но если компьютер разработчика находится за NAT, то прямой доступ с сервера к нему невозможен.
Я давно использую xdebug на localhost, но, разобравшись с port forwarding, научился отлаживать на удаленном сервере и решил написать инструкцию, которая может быть полезной каждому разработчику, а главное — она работает.
В качестве IDE я использовал PhpStorm, браузер Chrome, ОС Ubuntu. Port forwarding без проблем работает и в windows.

Настройки сервера


sudo apt-get install php5-xdebug
sudo nano /etc/php5/conf.d/xdebug.ini

Опция xdebug.idekey может быть PhpStorm1, netbeans-xdebug, XDEBUG_ECLIPSE, в зависимости от IDE, или пустым.
zend_extension=/usr/lib/php5/20100525/xdebug.so
xdebug.profiler_enable = 0
xdebug.remote_enable = 1
xdebug.remote_host = 127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.idekey=PhpStorm1

В итоге вывод phpinfo() должен содержать информацию о xdebug:


Настройки клиента


Chrome Xdebug helper

Если планируется использовать idekey, то для Chrome нужно поставить Xdebug helper.
В настройках расширения параметр IDE key нужно указать PhpStorm1 и в Domain filter вписать host. При отладке в адресной строке нужно нажимать Debugging Enabled.


Настройка PhpStorm

File -> Settings -> xdebug. Port 9000. На панели Edit debug configuration -> Add New Configuration -> PHP Web Application
Нужно указать Name, Start URL, создать новый сервер. У сервера указать Name, Host, Port, path mapping. Сохранить все.

Теперь можно поставить точку останова и нажать на кнопку debug, чтобы IDE начала слушать порт. Запустится браузер со страницей Server + Start URL, а в параметре будет XDEBUG_SESSION_START, который определяет идентификатор сессии. Не теряйте его при отладке.

Port forwarding

Xdebug стучится в порт, который слушает IDE. Если мы хотим отлаживать удаленный сервер и сидим за NATом, то наши порты недоступны. Оптимальный вариант — перенаправление удаленного порта на локальный с помощью ssh. Для работы под windows нужно установить Cygwin с пакетом ssh.
$ ssh -R 9000:127.0.0.1:9000 user@server

Проверка port forwarding

Нужно попробовать установить связь на удаленной машине на ее 9000 порт. Если все сделано правильно, то соединение будет установлено, по факту, с нашим локальным портом.
Успешеный коннект:
> telnet 127.0.0.1 9000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Горячая клавиша выхода из telnet сессии — Ctrl + ].
Возможные ошибки:
telnet: Unable to connect to remote host: Connection refused - Перенаправление не работает. Возможно проблема в антивирусе или файрволе.
Connection closed by foreign host - IDE не слушает порт
Метки:
  • +13
  • 10,5k
  • 8
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 8
  • 0
    Спасибо! Только вчера задумался о дебаге в PhpStorm.
    • 0
      Почему то не получается настроить в Komodo IDE (в самом komodo отладка работает, но не нашел как запустить скрипт с параметрами). В php.ini прописал:
      [XDebug]
      ;; Only Zend OR (!) XDebug
      zend_extension_ts=«D:/webserver/php/ext/php_xdebug.dll»
      xdebug.remote_enable=1
      xdebug.remote_host=127.0.0.1
      xdebug.remote_port=9000
      xdebug.remote_handler=dbgp
      xdebug.profiler_enable=0
      ;xdebug.profiler_output_dir=«D:\webserver\tmp»

      , komodo слушает порт, но останова на точке не происходит… Что ещё можно проверить?
      • 0
        Если вы проверили 9000 порт с помощью telnet, то дело в xdebug. Проверьте phpinfo (я добавил скриншот в статью).
        • 0
          Спасибо, разобрался:
          надо в переменные окружения внести set XDEBUG_CONFIG=remote_port=9000 remote_enable=1
          тогда скрипт подхватывается отладчиком.
      • 0
        У меня тоже возникла проблема с тем, что оно игнорит точки останова. У меня netbeans
        • 0
          UPD: связь есть.
          На локальном хосте процесс java открывает порт 9000

          По телнету сервер с xdebug на порт 9000 лазит без проблем.
          В бразуере открывает страницу с GET параметром XDEBUG_SESSION_START=nb

          В php.ini все прописано.
          Но! xdebug взят из pecl, где написано, что его надо подключать как Zend Extention => если его подключить как zend_extension_ts, то не работает ничего и в phpinfo() не отображается (вроде и не должно)
          А если подключаем его как простой extention, то имеем Warning при рестарте php-fpm (Xdebug MUST be loaded as Zend Extention), хотя все работает (кроме точек останова).
          В phpinfo() можно видеть инфу о xdebug (хотя и с warning'ом)

          Почему могут игнориться breakpoints?
          • 0
            UPD2: локально все работает на ура
            • 0
              UPD3: Я тоже разобрался
              Вместо zend_extension_ts надо было писать zend_extension

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.