Поиск…


Профилирование с помощью 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.

KCachegrind

Это отобразит информацию, в том числе:

  • Выполненные функции
  • Время вызова, как самого, так и включающего последующие вызовы функций
  • Количество вызовов каждой функции
  • Графы вызова
  • Ссылки на исходный код

Очевидно, что настройка производительности очень специфична для случаев использования каждого приложения. В общем, полезно искать:

  • Повторные вызовы на ту же функцию, которую вы не ожидали увидеть. Для функций, которые обрабатывают и запрашивают данные, это может быть основными возможностями для кэширования вашего приложения.
  • Медленные функции. Где приложение тратит большую часть времени? лучший выигрыш в настройке производительности фокусируется на тех частях приложения, которые потребляют больше всего времени.

Примечание . Xdebug и, в частности, его профилирующие функции, очень ресурсоемкие и замедляют выполнение PHP. Рекомендуется не запускать их в среде производственного сервера.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow