Перехват медленных хитов в Битрикс и их анализ в Xhprof

08.06.2017
Написал такую маленькую, но очень полезную штуку для отлова всех тормозных страниц на сайте.
На сервере должен быть установлен и настроен Xhprof. Как это сделать - погуглите :) Ну или здесь почитайте.
Скрипты интерфейса Xhprof у меня лежат в директории /xhprof-0.9.4/ в корне сайта. Можете вынести в свою директорию или вообще в отдельный домен можно это все разместить, чтобы все секьюрно и правильно было.
Вот, собственно, код который размещаем в /bitrix/php_interface/dbconn.php:
define('ENABLE_XHPROF',true);
if(ENABLE_XHPROF && function_exists('xhprof_enable'))
{
   global $getMicrotime;
   $getMicrotime = function(){
      list($usec,$sec) = explode(' ', microtime());
      return doubleval($usec) + doubleval($sec);
   };
   xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
   $GLOBALS['xhprof_start_time'] = $getMicrotime();
   register_shutdown_function(function() {
      global $getMicrotime;
      $xhprof_data = xhprof_disable();
      $tStart = $GLOBALS['xhprof_start_time'];
      $diffTime = $getMicrotime()-$tStart;
      if($diffTime > 1)
      {
         $timeF = round($diffTime, 3) . "";
         $timeF = str_replace('.', '-', $timeF);
         $client = $_SERVER['SHELL']?'shell':'http';
         $uri = $_SERVER['REQUEST_URI']?$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']:$_SERVER['PHP_SELF'];
         $uri = explode('/', $uri);
         $uri = implode('|',$uri);
         $xhprofCode = $client.'__'.$uri.'__'.$timeF.'s';
         $xhprofCode = preg_replace('#[^a-z0-9_|-]#i', '_', $xhprofCode);
         $pathXhprof = $_SERVER['DOCUMENT_ROOT'].'/xhprof-0.9.4';
         include_once $pathXhprof.'/xhprof_lib/utils/xhprof_lib.php';
         include_once $pathXhprof.'/xhprof_lib/utils/xhprof_runs.php';
         $xhprof_runs = new XHProfRuns_Default();
         $run_id = $xhprof_runs->save_run($xhprof_data, $xhprofCode);
      }
   });
}
Данный код отлавливает все хиты, работающие больше 1 сек, и заносит их в лог xhprof. В результате в логах Xhprof'а увидим вот такие записи:
Дааа, работы капец как много))
В имени каждого файла отмечается тип запроса к скрипту (http или shell), путь до скрипта и время работы скрипта.
Затем, попивая чай/кофе, можно спокойно проанализировать какие участки кода вам нужно доработать по вот таким наглядным графам вызова функций:

Еще один момент. Иногда граф не прорисовывается до конца и изображение прерывается.

В этом случае нужно установить в PHP настройку mbstring.func_overload=0. Соответственно для Битрикса это будет плохо, поэтому интерфейс просмотра логов xhprof желательно вынести на отдельный хост.


Всё. Всем удачной охоты :)

← Вернуться к списку заметок