Всем привет!
В данной статье хочу рассказать о своем опыте установке и настройки xhprof для php7, а также с трудностями адаптация нестандартного графического интерфейса XHGui.
xhprof — php-расширение от facebook. Это иерархический профайлер, который позволяет собирать такую статистику как время выполнения каждой функции, использование памяти, время ожидания, количество вызовов и многое другое
Если ранее Вы не слышали про xhprof - на данную тему написано немало статей, рассказывающих, что это и как его готовить.
Самое печальное в этом проекте это то, что facebook перестали поддерживать данное расширение и после перехода на php7 оно стало не доступно. Но есть различные форки проекта, которые исправляют данное положение.
Для себя я выбрал tideways-xhprof
Рецепт, как пересобрать и использовать расширение можно прочитать в readme на github проекта
После пересборки php и запуска стандартного веб-интерфейса xhprof, я остался не доволен полученным полученным результатом: внешний вид интерфейса разрабатывался очень давно, соответственно имеет ООООЧЧЧЧЕЕЕЕНННЬЬЬ древний вид. Сначала были мысли самому его кастомизировать, но на помощь пришли ссылки на странице tideways (ссылка есть выше) на различные gui.
Мой выбор пал на preinheimer/xhprof, в основном из-за того, что он работает с MySQL.
После установки пакета, настройки конфига, создания таблицы в БД, подключения хоста для GUI, я не мог понять, почему мои данные не отображаются в интерфейсе, ведь в стандартном GUI они отображались. Немного покопавшись в инструкциях, разобрался: теперь в скрипте нужно использовать не функции tideways_xhprof, а подключать файл из установленного пакета xhprof/external/header.php . После этого все заработало.
Так как я работаю с битриксом, то процесс подключения методом include хедер файла в шаблоне мне показался не очень удобным, т.к. на сайте имеется несколько активных шаблонов, и периодически появляются новые, а также хочется использовать данную систему для других сайтов (тоже на битриксе).
Решение проблемы было следующим:
Создаем обработчик события OnBeforeProlog
AddEventHandler("main", "OnBeforeProlog", 'beforePrologXhprofHandler');
function beforePrologXhprofHandler(){
$xhprofPath = 'ПУТЬ_К_XHPROF/xhprof/external/header.php';
if(file_exists($xhprofPath)){
include $xhprofPath;
}
}
И …. Я был очень разочарован, что данная конструкция не заработала. Точнее заработала, но не вся: файл header php подключился, но при отработке функции xhprof_shutdown_function() в нее, через глобальные переменные должен был передаваться массив $_xhprof, но после подключения ядра битрикса, этот массив был пустым.
Для решения данной проблемы я сделал свой форк проекта и доработал передачу массива параметров через сессию.
Также мне показался не удобным формат отображения времени и памяти, поэтому были добавлены функции, которые переводят время из микросекунд в секунды и память из байт в мегабайты. Моим глазам так проще работать.
Спасибо за внимание. Если у Вас есть вопросы, задавайте в комментариях.