Налаштування профайлера XHprof для універсального використання

03.12.2011
Налаштування профайлера XHprof для універсального використання
Автор:

В моїй попередній статті розглядалися можливості профайлера РНР кода XHprof від веб розробників Facebook-а, а саме піднімалися питання встановлення, налаштування і використання.

Поставлена задача налаштує профайлер для універсального використання в вигляді:

/mysite/page?debug

В нас це вийшло. Тому у даній статті розглядається ця проблема.

І так:

0) визначаємо девелопмент-сервер на якому ми хочемо профілювати і робити аналіз веб-додатків.

2) в корні домену створюють домен xhprof_log.

3) в корні домена створюють файл xhprof.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мс.  Інколи це важливо.

В такому випадку користуються спрощеним режимом “?debug=simple”. Тепер XHprof не підключається взагалі, і ми бачимо системний вивід реальних даних про ресурси в спрощеному вигляді знизу сторінки:

 time = 0.0020 seconds

 memory_get_usage = 143.156 kb

 memory_get_peak_usage = 183.211 kb

3 votes, Рейтинг: 5

Також по темі

1

В наші дні всі знають про такі ітернет магазини як eBay, Amazon і.т.д. Проте, мало хто знає...

2

Не всі знають, що модуль Views надає досить обширний API....

3

В продовження двох попередніх статей (клікклік) про...

4

Інколи виникає необхідність для зручності вводу даних створити поле з автозапоненням (autocomplete field). Прикладами таких полів можуть бути віджети для cck-полів Node reference i User reference...

5

У сфері ІТ технологій розробникам важливо не тільки продемонструвати свої вміння та навички, а й вміти вдосконалювати їх. 

Subscribe to our blog updates