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

в 9:57, , рубрики: php, xdebug, Песочница, метки: ,

Каждый разработчик время от времени сталкивается с непонятными ошибками. Как правило, их причина неочевидна и чтобы их пофиксить, нужно детально понять, что происходит в коде. Для отладки на localhost удобно использовать модуль xdebug. Когда выполнение кода доходит до точки останова, xdebug соединяется к IDE, которая слушает порт (по умолчанию 9000). Если вы находитесь в прямой видимости удаленного сервера, то можно прописать в конфиге 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

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

Chrome Xdebug helper

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

Настройка PhpStorm

File -> Settings -> xdebug. Port 9000. На панели Edit debug configuration -> Add New Configuration -> PHP Web Application
Нужно указать Name, Start URL, создать новый сервер. У сервера указать Name, Host, Port, path mapping. Сохранить все.
Удаленная отладка с использованием xdebug port forwarding
Теперь можно поставить точку останова и нажать на кнопку 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 сессии, необходимо заново законнектиться по обычному ssh соединению ее и убить процесс:

> ps ax | grep telnet
23264 pts/1    S+     0:00 telnet 127.0.0.1 9000
23566 pts/3    S+     0:00 grep telnet
> kill -9 23264

Возможные ошибки:

telnet: Unable to connect to remote host: Connection refused - Перенаправление не работает. Возможно проблема в антивирусе или файрволе.
Connection closed by foreign host - IDE не слушает порт

Автор: karser

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js