Профилирование — это сбор данных о том, как выполняются разные участки кода в вашей программе. Имея такие данные, можно оптимизировать быстродействие приложения или просто получше узнать, как работает ваш код. Для PHP существует два основных решения: Xdebug и XHprof.
С помощью Xdebug можно профилировать код и анализировать статистику, но есть серьезный недостаток — эту утилиту нельзя использовать на боевых сайтах, она слишком тяжелая (ресурсоёмкая).
Альтернатива — XHprof, это решение от компании Facebook, которое создаёт минимальную нагрузку на приложение. Рассмотрим настройку XHprof и Drupal 7.
Drupal 7, Devel, Ubuntu 14, NGINX, PHP5-FPM
Установка и настройка
Установим XHprof:
sudo pecl install xhprof-beta
Создадим директорию и добавим права:
mkdir /tmp/xhprof
chmod 777 /tmp/xhprof
Добавим расширение в php.ini (php5/fpm/php.ini и php5/cli/php.ini):
extension=xhprof.so
xhprof.output_dir=/tmp/xhprof
Перезапускаем и проверяем:
sudo service php5-fpm restart
php --ri xhprof
Настройка Devel
Нам потребуется модуль Devel. В настройках модуля /devel/settings нужно прописать директорию, куда установился XHprof (директория должна была отобразиться при установке):
Настройка NGINX
В конфигурационный файл NGINX (который отвечает за исследуемый сайт) добавляем новый локейшен. Не забудьте изменить адрес установки /usr/share/php/, если у вас он отличается:
location /xhprof_html {
root /usr/share/php/;
index index.php;
location ~ ^/xhprof_html/(.+\.php)$ {
try_files $uri =404;
root /usr/share/php/;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_pass php-fpm;
}
}
Перезапускаем NGINX:
sudo service nginx restart
В итоге, должны заработать URL вида: http://MYSITE.COM/xhprof_html/index.php
Пример данных
Описание значений
- Calls — количество и процентное соотношение вызовов функции (How many times the function is called)
- Incl. Wall Time — время выполнения функции с вложенными функциями (Function execution time include all child function calls)
- Excl. Wall Time — время выполнения функции без вложенных функций (Function execution time exclude all child function calls)
- Incl. CPU — процессорное время с учётом вложенных функций. How much time the CPU spent running the function (include all child function calls)
- Excl. CPU — процессорное время без учёта вложенных функций. How much time the CPU spent running the function (exclude all child function calls)
- Incl. MemUse — потребление памяти с учётом вложенных функций. How much memory is being used by the function (include all child function calls)
- Excl. MemUse — потребление памяти без учёта вложенных функций. How much memory is being used by the function (exclude all child function calls)
- Incl. PeakMemUse — максимальное потребление памяти с учётом вложенных функций. Max memory usage (include all child function calls)
- Excl. PeakMemUse — максимальное потребление памяти без учёта вложенных функций. Max memory usage (exclude all child function calls)
Граф вызовов
Можно просматривать визуальный граф вызовов, для этого нужно установить graphviz:
sudo apt-get install graphviz
На странице с перечнем функций будет ссылка View Full CallGraph, она ведёт на схемы вызовов, тяжелые – выделены цветом.
Профилирование фрагмента кода
Можно выделить свою функцию или кусок кода:
xhprof_sample_enable();
$result = some_my_function($fields['nid']->content);
$xhprof_data = xhprof_sample_disable();
dsm($xhprof_data);
На выходе будет массив с данными.