Отладка PHP, Drupal и MySQL/MariaDB.

Введение

В серии статей я постараюсь как можно полнее описать и систематизировать процесс отладки PHP, Drupal и MySQL/MariaDB. Я расскажу о способах отладки, специальном программном обеспечении (в частности IDE), настройке. Так же мы отдельно коснемся отладки запросов к СУБД как MySQL/MariaDB.

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

Без отладки, как правило, не обходится ни один крупный проект. Неважно это сайт на Yii Framework или Drupal. Заполнение кода бесчисленными конструкциями print_r(), dpr() и пр. давно исчерпало себя. Существенно замедляет процесс “тяжелыми” и запутанными “дампами”. Конечно, если ваш код заполнен на 100% unit-тестами, отладчик не нужен, но таких проектов очень мало. Без call trace (отслеживание стека вызовов) порой выяснить причину ошибки или потери данных не представляется возможным и вместо того, чтобы терять драгоценное время можно быстро отследить проблемный участок кода. Без профилирования оптимизировать код очень тяжело.

Часть 1. Обзор и сравнение

Обзор технологии

Ядром PHP выступает Zend Engine (далее ZE). Так называемый слой занимается управлением памятью, интерпретацией кода, его компиляцией, выполнением и т.д.; так же ZE осуществляет взаимодействие и выполнение различных сторонних расширений. Есть два вида расширений: Zend и (не-Zend). Отличие между ними, если кратко, в уровне выполнения. Zend расширения выполняются буквально в ядре, тем самым обеспечивая производительность и глубокую интеграцию. Ситуация отладки как раз требует как можно ближе подобраться к коду.

Обратите внимание на два вида PHP: TS (thread safe) и NTS (non thread safe). Для каждой разновидности PHP отдельные расширения!

TS используется на серверах, где на каждый запрос отводится отдельный поток (мультипоточность) и место в памяти. NTS используется на серверах, где нет поддержки мультипоточности. Например сервер IIS (Internet Information Service) от Microsoft, который, как вы уже, наверное догадались, работает на Windows, использует PHP NTS. Разные сервера используют различные виды PHP, оптимизированы по-разному и используются в различных ситуациях.

Как видно из схемы ниже:

в независимости от конфигурации backend (FPM и т.д.), чтобы отладка стала возможной должно быть установлено специальное расширение. Это расширение при каждом запросе, принадлежащем отладочной сессии, связывается с IDE (или другой подходящей программой), посредством порта, прослушиваемым этой IDE.

Сессия отладки инициируется на стороне пользователя (1 п.). Сессия может длиться в течении одной полной загрузки страницы либо до отмены пользователем. Сессия может быть запущена как из IDE, так и браузера. В независимости от места запуска сессии механизм таков: устанавливаются cookies или к URL добавляются параметры.

Как только backend получает запрос и перенаправляет его PHP, расширение отладки получает данные (2 п.) и устанавливает соединение (3 п.) посредством порта, прослушивающегося IDE (4 п.). При успешном соединении IDE захватывает сеанс и начинается процесс отладки в ее контексте при непосредственном участии пользователя.

Существует большое число IDE при небольшом количестве расширений для отладки. Мы рассмотрим самые известные и широко используемые. Я начну с расширений для отладки.

Расширения

“XDebug”, пожалуй одно из самых используемых и известных расширений для отладки.

Автор один из разработчиков языка PHP. Расширение содержит множество настроек, поддерживает профилирование. Немаловажен факт, что расширение имеет открытую бесплатную лицензию, активно разрабатывается и имеет самую доступную и подробную документацию. Практически на любую версию PHP (включая TS и NTS разновидности) можно установить XDebug.

Большинство популярных IDE таких как: PhpStorm, NetBeans, PDT (основана на Eclipse) - имеют встроенную поддержку XDebug.

“Zend Debugger”. Вероятно вам известно, что версия PHP 3.0 была написана будущими основателями Zend Technologies. PHP и по сей день активно разрабатывается при непосредственном участии этой компании, решения которой влияют на дальнейшую судьбу PHP.

Расширение, созданное в компании, имеет самую тесную интеграцию с ZE. Отсюда вытекают производительность, технологичность и оптимизированность. Но за все эти прелести придется платить коммерческой лицензией, которая стоит, увы, не малые деньги, даже по меркам Западной Европы и Америки.

Поддержкой отладки с помощью Zend Debugger похвастаться может только PhpStorm и Zend Studio. Да и запустить расширение для новых версий PHP без Zend Server невозможно. Но в серьезных ситуациях “игра стоит свеч”, о чем будет рассказано в статье об использовании Zend Debugger.

“NuSphere PhpEd Debugger (сокр. dbg)”, данное расширение связано с IDE от компании NuSphere и без лицензии на PhpEd вы это расширение не сможете использовать. Как ни парадоксально, в отличие от “хозяев” PHP, разработчики из компании NuSphere смогли создать самое стабильное, производительное и легкое из всех существующих решений, при этом с достаточным функционалом. Устанавливается на любую версию PHP (5.2 и выше, TS или NTS). Редактор PhpEd на сегодняшний день самый быстрый и экономный на ресурсы. Редактор способен открывать проекты со 100 тысячами файлов, отзывчиво работать, показывать autocomplete и подсказки для кода, при этом без видимых задержек, потребляя минимум оперативной памяти. Отладку можно осуществлять даже через SSH-туннель (расскажу подробнее в одной из следующих статей) без кропотливого конфигурирования. Dbg, пожалуй, не глядя на лицензию, самое удачное расширение для отладки.

Меня бы вполне устраивал PhpEd (и цена с “небольшим скрипом”), если бы в нем была поддержка Git “из коробки” и был более широкий функционал редактирования кода (рефакторинг, выделение колонкой и пр.).

Сравнение

При сравнении лицензии в первую очередь учитывалась цена. В документации, кроме наличия инструкций по установке, приветствуется подробное описание опций и дополнительного функционала. Производительность измерялась на отладке модулей panels и views в Drupal при холодном старте (первом запуске) и при переходе между точками остановки (breakpoints). Функционал определяется по доступным опциям. Качество отчетности - это то, насколько больше отладочной информации может быть отображено. И наконец, управление определяется по удобству контроля за сеансом отладки: это и понятный UI, и дополнительные возможности, как построчное выполнение и пр.

  XDebug Dbg (NuSphere) Zend Debugger
Лицензия/цена Open source
 
Коммерческая
 
Коммерческая
 
Документация
 
 
 
Производительность
 
 
 
Функционал
 
 
 
Отчетность
 
 
 
Управление
 
 
 

В следующей статье я подробно расскажу про нюансы отладки PHP, Drupal и MySQL/MariaDB.