XDebug - дебаг и профилирование кода php (profiling)

С помощью систем профилирования можно собрать информацию о том, какие функции и вызовы сколько потребляют процессорного времени, что позволяет выявить наиболее медленные, ресурсоемкие участки PHP-программы.

Существуют "классические" методы отладки - echo, var_dump, print_r, но в этой статье поговорим о более продвинутом способе дебага - xDebug. Расширение php xDebug предназначено для пошагового выполнения кода и просмотра значений переменных, что поднимает программирование на PHP на новый уровень.

В этой статье рассматривается настройка xDebug в IDE PhpStorm.

Подключение xDebug

Для работы xDebug PHP должен работать в режиме CGI. Для переключения режима работы PHP откройте раздел Сайты панели управления, нажмите на кнопку "PHP" напротив нужного домена и поставьте галочку "Режим CGI". На переключение режима работы может потребоваться до 15 минут.

Для включения расширения xDebug нужно добавить следующие строки в конец файла cgi-bin/php.ini (находится в каталоге сайта):

zend_extension = xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=8014
xdebug.idekey=PHPSTORM
xdebug.remote_autostart=1

Обратите внимание! В некоторых случаях может потребоваться указать полный путь к файлу расширения!
При этом первая строка должна иметь следующий формат:

zend_extension = /usr/local/php-cgi/<версия.php>/lib/php/<версия php extension>/xdebug.so

Например, для PHP 5.4 на сервере hugo путь будет таким:

zend_extension = /usr/local/php-cgi/5.4/lib/php/20100525/xdebug.so

Часть пути, включающая версию PHP Extension может отличаться в зависимости от сервера и версии PHP. Посмотреть нужную версию можно при помощи функции phpinfo().
Как создать файл с вызовом функции описано далее в статье: перейти

Если каталог cgi-bin и/или файл php.ini отсутствуют, их нужно создать:

account@server:~/site.com/public_html [0] $ mkdir cgi-bin
account@server:~/site.com/public_html [0] $ php5.6 --ini | head -n2
Configuration File (php.ini) Path: /etc/php/cgi/5.6
Loaded Configuration File:         /etc/php/cgi/5.6/php.ini
account@server:~/site.com/public_html [0] $ cp /etc/php/cgi/5.6/php.ini cgi-bin
account@server:~/site.com/public_html [0] $

При необходимости вместо 5.6 можно вызвать PHP другой версии:

+-----------+---------------------+
|  Версия   | Команда для запуска |
+-----------+---------------------|
| PHP  v4.4 |        php4.4       |
| PHP  v5.2 |        php5.2       |
| PHP  v5.3 |        php5.3       |
| PHP  v5.4 |        php5.4       |
| PHP  v5.5 |        php5.5       |
| PHP  v5.6 |        php5.6       |
| PHP  v7.0 |        php7.0       |
| PHP  v7.1 |        php7.1       |
+-----------+---------------------+

Для проверки настроек нужно создать в корне сайта файл x.php со следующим содержимым:

<?php
phpinfo();
?>

В браузере проверяем, подхватились ли настройки php.ini:

В этом примере рассматривается настройка порта 8014. Проверка того, свободен ли выбранный порт (выполняется на Вашем компьютере):

root@supcomp:~# netstat -tlnp
Активные соединения с интернетом (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State       PID/Program name
tcp        0      0 0.0.0.0:40103           0.0.0.0:*               LISTEN      7081/java
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1223/mysqld
tcp        0      0 127.0.0.1:36555         0.0.0.0:*               LISTEN      6786/cli
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      1176/systemd-resolv
tcp        0      0 127.0.0.1:63342         0.0.0.0:*               LISTEN      4682/java
tcp        0      0 127.0.0.1:63343         0.0.0.0:*               LISTEN      7081/java
tcp        0      0 127.0.0.1:5939          0.0.0.0:*               LISTEN      1628/teamviewerd
tcp        0      0 0.0.0.0:33493           0.0.0.0:*               LISTEN      7211/java
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1222/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      3575/cupsd
tcp        0      0 127.0.0.1:6942          0.0.0.0:*               LISTEN      4682/java
tcp        0      0 127.0.0.1:6943          0.0.0.0:*               LISTEN      7081/java
tcp        0      0 127.0.0.1:44385         0.0.0.0:*               LISTEN      7211/java
tcp6       0      0 :::5355                 :::*                    LISTEN      1176/systemd-resolv
tcp6       0      0 :::80                   :::*                    LISTEN      1387/apache2
tcp6       0      0 :::1716                 :::*                    LISTEN      2569/kdeconnectd
tcp6       0      0 :::22                   :::*                    LISTEN      1222/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      3575/cupsd
root@supcomp:~# netstat -tlnp | grep 8014
root@supcomp:~#

Можно выбрать и стандартный порт xDebug - 9000.

Настройка работы IDE PhpStorm с xDebug

Со справкой по установке IDE PhpStorm можно ознакомиться на официальном сайте разработчиков.

Для обеспечения совместной работы xDebug и IDE PhpStorm необходимо создать туннель к серверу с локального компьютера. Команда для Linux и OS X:

$ ssh -R 8014:localhost:8014 account@account.beget.tech

Если Вы используете ОС Windows — Вам понадобится утилита PuTTy, процесс ее установки и настройки описан в этой статье. Для настройки туннеля нужно указать имя сервера либо его IP. Уточнить эту информацию можно в Личном кабинете, в таблице "Общая информация". Порт по умолчанию остается 22, протокол - SSH:

После этого нужно открыть вкладку "Tunnels" и настроить так, как указано на скриншоте. После ввода настроек нужно нажать кнопку "Open":

Здесь нужно нажать на "Да":

После чего вводим логин и пароль (они такие же, как и для доступа к Личному кабинету).
! Если ранее была настроена авторизация по ключам — вводить логин и пароль не потребуется.

Не забудьте включить SSH в Личном кабинете. Для этого нужно в Панели Управления аккаунтом нажать на переключатель напротив пункта SSH-доступ. Он находится на главной странице слева, в блоке "Тех. информация"

Если Вы работаете с FTP-аккаунтом, то SSH должен быть включён для него. SSH для FTP-аккаунтов включается в разделе FTP переключателем напротив нужного аккаунта.

Рассмотрим настройку PhpStorm с уже созданным локальным проектом.

Для отображения файлов сайта в PhpStorm нужно произвести некоторые настройки. Во вкладке "Settings" нужно настроить порт, на котором будет работать PhpStorm. В рассматриваемом примере это порт 8014, однако, Вы можете оставить порт по умолчанию - 9000.

Затем во вкладке "Servers" нужно настроить подключение PhpStorm к Вашему техническому домену account.beget.tech на 80 порт (либо 443, если для домена выпущен SSL-сертификат и сайт работает по HTTPS) (необходимо указать домен, на котором ранее был установлен XDebug). В настройках подключения также требуется указать соответствие путей, для этого отметьте галочкой пункт "Use path mappings". В левой части приведён локальный список файлов, справа указывается путь на сервере.

Как правило требуется задавать соответствие только для корневого каталога веб-сервера:

При использовании фреймворков, таких как Yii, Laravel или Symfony, необходимо отдельно указывать пути к директориям, в которых размещаются исходные коды проекта и корневой каталог веб-сервера.
Пример корректной настройки маппингов для проекта на Symfony:

Далее во вкладке "DBGp Proxy" указываем IDE-key PHPSTORM, который был ранее указан в файле php.ini, затем адрес сервера, который можно посмотреть в Личном кабинете, в таблице "Тех. информация", и указываем удаленный порт, с которого будeт приходить отладочная информация. Нужно будет нажать "Apply", затем "OK":

Для корректной работы дебага может потребоваться настройка конфигурации развёртывания проекта. Для этого откройте пункт меню "Tools" — "Deployment" — "Configuration". Здесь потребуется указать настройки для подключения к серверу по FTP либо SFTP. Мы рекомендуем использовать протокол SFTP — он более стабилен и безопасен. В качестве имени хоста укажите Ваш технический домен. Далее укажите логин и пароль для входа в систему. При использовании SFTP можно выбрать ключ, с которым выполняется авторизация по SSH. После этого нажмите на кнопку "Autodetect" рядом с пунктом "Root path" — будет определён домашний каталог учётной записи.
Обратите внимание! При использовании SFTP нажимать на кнопку обзора файловой системы (кнопка с тремя точками справа от поля Root Path) на этой вкладке не нужно. Обзор файловой системы по SFTP начинается с корневого каталога, доступ к которому запрещён, поэтому при попытке просмотра файловой системы возникнет ошибка Permission Denied.

После этого на вкладке "Mappings" укажите каталог, в котором размещены файлы проекта (здесь уже можно воспользоваться функцией обзора файловой системы сервера). Для большинства сайтов путь будет вида "/site/public_html". При использовании Yii, Symfony, Laravel и некоторых других фреймворков — /site (если Вами не была изменена структура проекта по умолчанию). В нашем примере используется Symfony, поэтому путь указываем без "public_html"

Чтобы узнать значения переменных в определенном месте скриптов, нужно сообщить PhpStorm, где именно нужно искать значения. Для этого предназначены брейкпоинты (точки останова).
Обратите внимание! Локальный файл и файл, размещённый на сервере, должны быть синхронизированы!
Сейчас нужно выставить брейкпоинт, указанный первым пунктом. Выбрав нужную строку php-кода, нужно нажать на область справа от номера строки либо нажать сочетание клавиш "Ctrl+F8", после чего включить прослушивание порта (стрелка 2), на который xDebug будет посылать ответ при запуске скрипта.

После этого можно открыть сайт в браузере. При первом входящем подключении от Xdebug будет запрошена информация о конфигурации проекта, необходимо выбрать текущий проект и конфигурацию деплоя, которая была настроена ранее. После этого нажмите кнопку «Accept».

По достижении точки останова в PhpStorm откроется дебаг-панель, где будут отображены значения всех переменных на момент обработки кода на месте брейкпоинта:

Также для наглядности значения переменных для исполненных участков кода указываются прямо в редакторе:

Для продолжения работы скрипта требуется нажать на кнопку "Resume Program" в дебаг-панели либо клавишу F9.





Удачной работы! Если возникнут вопросы - напишите нам, пожалуйста, тикет из Панели управления аккаунта, раздел "Помощь и поддержка".