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'а увидим вот такие записи:
Еще один момент. Иногда граф не прорисовывается до конца и изображение прерывается.
В этом случае нужно установить в PHP настройку mbstring.func_overload=0. Соответственно для Битрикса это будет плохо, поэтому интерфейс просмотра логов xhprof желательно вынести на отдельный хост.