Настройка профайлера 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_START4);
    
$cur  number_format(memory_get_usage() / 10243);
    
$peak number_format(memory_get_peak_usage() / 10243);
    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

Тэги:
PHP, XHprof, оптимизация, Профилирование