Настройка профайлера XHprof для универсального использования
В моей предыдущей статье рассматривались возможности профайлера PHP кода XHprof от разработчиков Facebook-а, а именно затрагивались вопросы установки, настройки и использования.
Поставлена задача настроить профайлер для универсального использования в виде:
http://mysite/page?debug
То есть, чтобы для каждой страницы можно было использовать профайлер одним универсальным способом.
У нас это получилось. Вот данная статья и раскрывает тему сисек.
Итак:
0) определяем девелопмент-сервер на котором мы хотим профилировать и делать анализ веб-приложений
1) создаем домен <xhprof_domain>. В директорию домена копируем папки xhprof_html и xhprof_lib из оригинальной папки XHprof .
2) в корне домена создаем папку xhprof_log.
3) в корне домена создаем файл xhprof.php с следующим содержанием:
<?php
function my_xhprof_enable() {
if (extension_loaded('xhprof')) {
switch ($_GET['debug']) {
case 'simple':
define('DEBUG_MICROTIME_START', microtime(1));
break;
case 'all':
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
break;
case 'cpu':
xhprof_enable(XHPROF_FLAGS_CPU);
break;
case 'memory':
xhprof_enable(XHPROF_FLAGS_MEMORY);
break;
case 'time':
default:
xhprof_enable();
}
}
}
function my_xhprof_disable() {
if ($_GET['debug'] == 'simple') {
$time = number_format(microtime(1) - DEBUG_MICROTIME_START, 4);
$cur = number_format(memory_get_usage() / 1024, 3);
$peak = number_format(memory_get_peak_usage() / 1024, 3);
print "\ntime = {$time} seconds<br />\nmemory_get_usage = {$cur} kb<br />\nmemory_get_peak_usage = {$peak} kb";
}
elseif (extension_loaded('xhprof')) {
include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_lib.php';
include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_runs.php';
$profiler_namespace = isset($_GET['namespace']) ? $_GET['namespace'] : $_SERVER['SERVER_NAME'];
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
$profiler_url = sprintf('<xhprof_domain>/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace);
print '<script type="text/javascript">window.location.href=\''. $profiler_url .'\';</script>';
}
}
if (isset($_GET['debug'])) {
my_xhprof_enable();
register_shutdown_function('my_xhprof_disable');
}
?>4) в php.ini немного подправляем строки, не забываем после этого перезапустить вебсервер:
extension=xhprof.so xhprof.output_dir=/path/to/your/<xhprof-domain>/on/server/xhprof_log auto_prepend_file=/path/to/your/<xhprof-domain>/on/server/xhprof.php
5) Enjoy IT! Наслаждаемся результатом!
На любой страничке любого домена на сервере дописываем в адресную строку GET-параметр «?debug» (или ?debug=time, или ?debug=memory, или ?debug=cpu, или ?debug=all) и смотрим на результат :)
![]() | ![]() |
Надо учесть важный момент, что при полноценном использовании XHprof время генерации странички возрастает в среднем на 2.5-4.5 мс, поэтому на очень легких страницах данные не соответствуют действительности. Например на страницах время генерации которых очень мало, надо понимать что есть погрешность в 2.5-4.5 мс. Иногда это важно.
В таком случае пользуемся упрощенным режимом “?debug=simple”. Теперь XHprof не подключается вообще, и мы видим системный вывод реальных данных о ресурсах в упрощенном виде внизу страницы:
time = 0.0020 seconds
memory_get_usage = 143.156 kb
memory_get_peak_usage = 183.211 kb




