Xdebug очень удобный инструмент для отладки PHP-кода. Работающий отлично в связке с PhpStorm на локальной машине. Но, иногда, бывает так, что нужно срочно отладить код на удаленной машине. Причины могут быть разные, к примеру, внешний тестовый сервер или работа вне дома/офиса. И, если у вас нет выделенного IP, возникают проблемы, потому что вы работаете из какой-либо подсети иXdebug не сможет достучаться до порта на вашей локальной машине на котором его ждет PhpStorm.
В такой ситуации поможет настройка SSH тунеля.

Содержание

  1. Установка и настройка Xdebug
  2. Настройка PhpStorm
  3. Создание SSH тунеля
  4. “Автоматизируем” создание тунеля в PhpStorm

Установка и настройка Xdebug

Установка Xdebug довольно простая.
Если у вас на сервере только одна версия PHP, то достаточно просто выполнить команду:

pecl install xdebug-*
# под звездочкой номер желаемой версии, например:
pecl install xdebug-2.8.1

Если у вас, как в моем случае, сервер работает под управлением ispmanager, то, скорее всего, у вас установлено несколько версий PHP для разный проектов. Если так, то вам нужно выяснить сначала какую версию использует проект, который вы хотите отлаживать. Если проект использует нативную версию php, то можете воспользоваться командой выше. Иначе, вам подойдет следующая команда:

# для php 7.2 и xdebug-2.8.1, команда, в моем случае, будет такая:
/opt/php72/bin/pecl install xdebug-2.8.1
#все альтернативные версии php лежат в папке /opt/

Далее, нужно подключить установленный Xdebug в конфиге и добавить необходимые настройки. Для этого находим расположение файла php.ini. Данный конфиг может лежать в разных мстах и/или состоять из нескольких файлов, поэтому, лучше посмотреть вывод функции phpinfo(), чтобы найти его. После этого добавляем настройки в конец файла:

XDebug 2

[xdebug]
zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

XDebug 3

[xdebug]
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_host=127.0.0.1
xdebug.client_port=9000

В целях безопастности, не рекомендую вам использовать порт по умолчанию (9000), лучше изменить его. Большая часть автоматизированных сканеров уязвимости отвалятся. В заметке об авторизации по SSH-ключу, я по мимо прочего сменил порт SSH, так вот, после этого небыло ни одной попытки авторизации. Так что просто сменой стандартных портов, можно избежать части проблем, как минимум, автоматизированных атак.
На этом настройка PHP закончена. Можно переходить к PhpStrom.

Настройка PhpStorm

Существует 2 способа настройки PhpStorm: Zero-Configuration Debugging и PHP Remote Debug.
Первый предполагает минимум настроек, второй дает немного больше возможностей.

Zero-Configuration Debugging

Хотя название и предполагает, что не нужно делать ни каких настроек, сделать их все же придется, т.к. мы работаем с удаленным сервером, а не локальным.
Итак, заходим в настройки (Ctrl+Alt+S), открываемо раздел Languages & Frameworks и выбираем в нем PHP.

.

В списке CLI Interpreter нам нужно добавить удаленный интерпритатор. Для этого жмем ... напротив выпадающего списка. Откроется окно настройки CLI-интерпритаторов. Жмем + чтобы добавить новый и вносим настройки соответствующие вашему серверу. Если все настройки указаны корректно, то после нажатия на refresh_btn, должна отобразиться информация о PHP, примерно как на скриншоте ниже:

.

Следующим шагом рекомендую настроить Deployment (Settings > Build, Execution, Deployment > Deployment), если вы еще этого не сделали. Настройка самая обычная ни чего сложного. Там нам важно правильно настроить Mappings(связи) между локальными и удаленными путями. Имейте в виду, что Deployment Path вводится относительно указанного на вкладке Connection путидо файлов (Root Path). Это особенно важно, если файлы проекта лежат за публичной дирректорией как у меня. Соответственно, мой конфик выглядит так:

.

Далее, в окне настроек переходим к настройке Debug (Languages & Frameworks > PHP > Debug). Первым делом нужно в секции Xdebug указать порт и, по желанию, снять галочку с пунктов Force break at the… . Так остановка выполнения скрипта будет происходить только на брейкпоинтах, а не в начале выполнения.
В этом же меню, рекомендую сразу проверить корректность сделанных настроек. Эмем на ссылку Validate в секщии Pre-configuration. В открывшемся окне выбираем Remote Web Server и в выпадающем списке Deployment server: выбираем созданный на предыдущем этапе сервер. После этого нажимаем Validate. Запустится проверка корректности настроек Xdebug. В результате дожно получиться что то вроде:

.

Единственное на что дожен поругаться валидатор – то что мы указали в настройках Xdebug удаленный хост 127.0.0.1, вместо нашего рекущего IP. Так и должно быть. Ведь мы же будем создавать тунель от удаленного хоста на наш.

Теперь нужно настроить DBGp Proxy (Languages & Frameworks > PHP > Debug > DBGp Proxy). Здесь все просто: указываем любой IDE key: (обычно PHPSTORM), указываем хост и порт из конфига Xdebug (в нашем примере это 127.0.0.1 и 9000 соответственно).
Сохраняем настройки.
Теперь активируем ожидание входящих соеиднений для отладки кнопкой в правом верхнем меню: . Пиктограмма должна смениться с этой на эту .

Создание SSH тунеля

Для создания тунеля используется команда:

ssh -R <remote_port>:localhost:<local_port> <user>@<host>
# Например
ssh -R 9000:localhost:9000 user_ssh@200.158.5.126

Итак, разберем части команды:
– ssh с ключом -R указывает что мы хотим “пробросить” соединения с удаленным сервером на указанном порту в указанный порт на локальной машине localhost.
<remote_port> – порт XDebug на удаленном сервере. Должен быть тот же, что вы указали в конфиге XDebug.
<local_port> – порт на локальной машине, куда будут перекидываться пакеты отправленные на удаленный порт.
<user> – SSH пользователь на удаленном хосте.
<host> – адрес удаленного хоста.

Дополнительно

Можно упростить себе жизнь и не писать постоянно пользователя и адрес и не вводить пароль. Все это можно добавитв удаленный хост в ssh config на локальной машине и обращаться к нему просто по указанному имени имени.
Для этого, предварительно, нужно настроить авторизацию по SSH-ключу. Как это сделать я писал в посте Авторизация на сервер по SSH-ключу и выключение авторизации по паролю. После чего, пробрасывать порт можно будет следующей командой и пароль вводить не потребуется.

ssh -R <remote_port>:localhost:<local_port> <алиас хоста из ssh config>
#например
ssh -R 9000:localhost:9000 my_test_server

External Command в PhpStorm

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

Для этого, открываем настройки (Ctrl+Alt+s) и в поиске пишем “External Tools” (или просто находим этот пункт в разделе Tools).
PhpStorm settings menu - External Tools

Далее, жмем +, чтобы добавить новую команду. Откроется окно создания команды-кнопки:

Create Tool

В этом окне указываем имя команды и, если нужно, описание.
В секции Tool Settings нужно заполнить поля следующим образом:
– Programm: ssh (программа которая будет запускаться по кнопке)
– Arguments (аргуменды для программы):
– Если НЕ создавали алиас хоста: -R <remote_port>:localhost:<local_port> <user>@<host>
– Если создавали: -R <remote_port>:localhost:<local_port> <алиас хоста из ssh config>
– Working directory (директория для запуска): $ProjectFileDir$ (я использую шаблон директории проекта)

Должно получиться что то вроде этого:

После сохранения всех настроект, в меню Tools->External Tools появится только что созданный нами пункт меню (в моем случае ssh_tunmel_uyt):

После нажатия на эту кнопку у вас откроется Tool Window Run в котором отображаются все запущенные команды. Нам важно, чтобы наша команда запустилась без ошибок (горела зеленая лампочка рядом с ее именем) и в логе не отображалось ни каких ошибок. Выглядеть это должно как то так:

Если все выглядит так же, значит тунель запущен и можно начинать отладку кода на удаленном сервере.