PHP
Спектакль
Поиск…
Профилирование с помощью XHProf
XHProf - это профилировщик PHP, первоначально написанный Facebook, чтобы предоставить более легкую альтернативу XDebug.
После установки PHP-модуля xhprof
профилирование может быть включено / отключено из кода PHP:
xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();
Возвращенный массив будет содержать данные о количестве вызовов, времени процессора и использовании памяти для каждой функции, доступ к которой осуществляется внутри doSlowOperation()
.
xhprof_sample_enable()
/ xhprof_sample_disable()
может использоваться как более легкая опция, которая будет регистрировать только профилирующую информацию для части запросов (и в другом формате).
XHProf имеет некоторые ( в основном недокументированные) вспомогательные функции для отображения данных ( смотрите пример ), или вы можете использовать другие инструменты , чтобы визуализировать его (platform.sh блог есть пример ).
Использование памяти
Предел памяти для среды исполнения PHP устанавливается через директиву INI memory_limit
. Этот параметр не позволяет одному исполнению PHP использовать слишком много памяти, изнуряя его для других скриптов и системного программного обеспечения. Предел памяти по умолчанию равен 128 М и может быть изменен в файле php.ini
или во время выполнения. У него может быть установлен лимит, но это обычно считается плохой практикой.
Точное использование памяти, используемое во время выполнения, можно определить, вызвав memory_get_usage()
. Он возвращает количество байт памяти, выделенных для текущего скрипта. Начиная с PHP 5.2, он имеет один необязательный логический параметр для получения общей выделенной системной памяти, в отличие от памяти, которая активно используется PHP.
<?php
echo memory_get_usage() . "\n";
// Outputs 350688 (or similar, depending on system and PHP version)
// Let's use up some RAM
$array = array_fill(0, 1000, 'abc');
echo memory_get_usage() . "\n";
// Outputs 387704
// Remove the array from memory
unset($array);
echo memory_get_usage() . "\n";
// Outputs 350784
Теперь memory_get_usage
использовать память в момент ее запуска. Между вызовами этой функции вы можете выделять и освобождать другие вещи в памяти. Чтобы получить максимальный объем памяти, используемой до определенной точки, вызовите memory_get_peak_usage()
.
<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776
Обратите внимание, что значение будет увеличиваться или оставаться постоянным.
Профилирование с помощью Xdebug
Расширение PHP под названием Xdebug доступно для профилирования приложений PHP , а также для отладки времени исполнения. При запуске профилировщика вывод записывается в файл в двоичном формате «cachegrind». Приложения доступны на каждой платформе для анализа этих файлов.
Чтобы включить профилирование, установите расширение и настройте параметры php.ini. В нашем примере мы будем запускать профиль по выбору на основе параметра запроса. Это позволяет нам сохранять статичные настройки и включать профилировщик только по мере необходимости.
// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
Затем используйте веб-клиент, чтобы сделать запрос на URL вашего приложения, которое вы хотите профилировать, например
http://example.com/article/1?XDEBUG_PROFILE=1
В процессе обработки страниц он будет записывать в файл с именем, похожим на
/tmp/cachegrind.out.12345
Обратите внимание, что он будет писать один файл для каждого выполняемого PHP-запроса / процесса. Так, например, если вы хотите проанализировать сообщение формы, для запроса GET будет отображаться один профиль для отображения формы HTML. Параметр XDEBUG_PROFILE должен быть передан в последующий запрос POST для анализа второго запроса, который обрабатывает форму. Поэтому при профилировании иногда проще запускать завиток в POST-форму напрямую.
После написания кеш профиля может быть прочитан приложением, например KCachegrind.
Это отобразит информацию, в том числе:
- Выполненные функции
- Время вызова, как самого, так и включающего последующие вызовы функций
- Количество вызовов каждой функции
- Графы вызова
- Ссылки на исходный код
Очевидно, что настройка производительности очень специфична для случаев использования каждого приложения. В общем, полезно искать:
- Повторные вызовы на ту же функцию, которую вы не ожидали увидеть. Для функций, которые обрабатывают и запрашивают данные, это может быть основными возможностями для кэширования вашего приложения.
- Медленные функции. Где приложение тратит большую часть времени? лучший выигрыш в настройке производительности фокусируется на тех частях приложения, которые потребляют больше всего времени.
Примечание . Xdebug и, в частности, его профилирующие функции, очень ресурсоемкие и замедляют выполнение PHP. Рекомендуется не запускать их в среде производственного сервера.