PHP. Установка и использование XHProf
О профилировании
Данные профиля могут помочь вам улучшить ваше приложение, то есть достичь определенных целей, к примеру, понизить потребление памяти, уменьшить время генерации страницы и так далее.
Информация в профиле является стартовой точкой в оптимизации: сообщается сколько времени генерируется результат, сколько памяти используется и сколько вызовов функций происходит. С помощью более подробных данных вы можете улучшить эти показатели.
Прежде всего, стоит оптимизировать функции, который требуют больше всего времени на исполнение. После того, как все оптимизировано и кажется, что улучшать больше нечего, стоит отсортировать функции по количеству вызовов и поработать над его понижением. Даже если PHP работает быстро, то стоит подумать, нужно ли вызывать функции так часто?
Почему именно XHProf, а не XDebug?
Основные недостатки XDebug
- огромный overhead (время выполнения программы умножается на 2+)
- оптимизация под XDebug на 90% безрезультатна после его отключения
- нельзя включать на проде (почему? см. выше)
Основные достоинства XHProf
- практически не даёт overhead'а
- можно использовать на продакшене (почему? см. выше)
Немного об XHProf
Для начала несколько слов о возможностях самого XHProf. Это профайлер для PHP, написанный на C как расширение. Он был разработан в Facebook и выложен в открытый доступ. Имеет несколько форков (uprofiler, Tideways), полностью совместимых на уровне формата выходных данных.
XHProf расставляет таймеры вокруг всех вызовов функций/методов. Его использование сопряжено с некоторыми накладными расходами. Но они не такие большие и позволяют использовать его в продакшене.
Результатом работы XHProf является массив элементов который содержит название функции/метода и параметры вызова: сколько cpu, количество вызовов, потребление памяти и т.д
Установка XHProf
Клонируем и устанавливаем расширение:
sudo apt-get install php7.0-dev
cd /usr/share/
git clone https://github.com/RustJason/xhprof
git checkout -b php7 origin/php7
cd xhprof/extension
phpize # что это такое можно прочитать тут https://www.php.net/manual/ru/install.pecl.phpize.php
./configure --with-php-config=/usr/bin/php-config
make && make install
если выскакивает ошибка "configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.", то надо выполнить следующую команду:
sudo apt-get install re2c
Если вы видите сообщения о ошибках но make прошел успешно, не стоит беспокоится, он даже в таком состоянии достаточно работоспособен. Как советует make, выполните make test.
Настройка XHProf
Исправляем конфиг PHP, добавляя расширение и прописываем путь до логов в php.ini:
[xhprof]
extension=xhprof.so
xhprof.output_dir=/var/path-to-logs
Включаем модуль:
cd /opt/php7.0/etc/php.d
sudo ln -s ../mods-available/xhprof.ini
перезагружаем веб-сервер. Для построения графиков устанавливаем пакет:
sudo apt-get install graphviz
Использование
define('XHPROF_DEBUG', extension_loaded('xhprof') && $_COOKIE['test'] == 1 && true); // заменить на false для отключения
if (defined('XHPROF_DEBUG') && XHPROF_DEBUG) {
$utils_path = "/usr/share/xhprof/xhprof_lib/utils/";
require_once($utils_path.'xhprof_lib.php');
require_once($utils_path.'xhprof_runs.php');
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_NO_BUILTINS);
}
// код для профилирования
if (defined('XHPROF_DEBUG') && XHPROF_DEBUG) {
$profiler_namespace = 'someapp'; // пространство запусков
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
}
Функция xhprof_enable() принимает в качестве аргументов флаги:
- XHPROF_FLAGS_CPU для фиксирования статистики процессора
- HPROF_FLAGS_MEMORY — для памяти
- XHPROF_FLAGS_NO_BUILTINS — для игнорирования встроенных функций.
xhprof_disable() выключит профайлер и вернет собранную статистику.
Просмотр отчета XHProf
Собранные данные можно проанализировать в интерфейсе XHprof для построения отчетов.
вид отчета
настройка показа отчета:
# сменить рабочий каталог на каталог сайта, доступный из веба, например:
cd /var/www/site.ru
# поставить симлинк на веб-интерфейс
ln -s /usr/share/xhprof/xhprof_html
После этого отчет можно будет увидеть тут: http://site.ru/xhprof_html