Каждый разработчик время от времени сталкивается с непонятными ошибками. Как правило, их причина неочевидна и чтобы их пофиксить, нужно детально понять, что происходит в коде. Для отладки на 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.
Настройка 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 сессии, необходимо заново законнектиться по обычному 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