Current Path : /var/www/html/clients/amz.e-nk.ru/bitrix/modules/perfmon/classes/general/ |
Current File : /var/www/html/clients/amz.e-nk.ru/bitrix/modules/perfmon/classes/general/keeper.php |
<? function perfmonErrorHandler($errno, $errstr, $errfile, $errline) { global $perfmonErrors; //if(count($perfmonErrors) > 100) // return false; static $arExclude = array( "/modules/main/classes/general/cache.php:150" => true, ); $uni_file_name = str_replace("\\", "/", substr($errfile, strlen($_SERVER["DOCUMENT_ROOT"].BX_ROOT))); $bRecord = false; switch($errno) { case E_WARNING: $bRecord = true; break; case E_NOTICE: if( (strpos($errstr, "Undefined index:") === false) && (strpos($errstr, "Undefined offset:") === false) && !array_key_exists($uni_file_name.":".$errline, $arExclude) ) $bRecord = true; break; default: break; } if($bRecord) { $perfmonErrors[] = array( "ERRNO" => $errno, "ERRSTR" => $errstr, "ERRFILE" => $errfile, "ERRLINE" => $errline, ); } //Continue with default handling return false; } class CAllPerfomanceKeeper { function OnPageStart() { if(!defined("PERFMON_STOP")) { $end_time = COption::GetOptionInt("perfmon", "end_time"); if(time() > $end_time) { CPerfomanceKeeper::SetActive(false); if(COption::GetOptionString("perfmon", "total_mark_value", "") == "measure"); COption::SetOptionString("perfmon", "total_mark_value", "calc"); } else { global $DB, $APPLICATION; define("PERFMON_STARTED", $DB->ShowSqlStat); $DB->ShowSqlStat = true; $APPLICATION->ShowIncludeStat = true; global $perfmonErrors; $perfmonErrors = array(); if(COption::GetOptionString("perfmon", "warning_log") === "Y") set_error_handler("perfmonErrorHandler"); } } } function OnEpilog() { if(defined("PERFMON_STARTED")) { global $DB; $DB->ShowSqlStat = constant("PERFMON_STARTED"); } } function OnBeforeAfterEpilog() { if(defined("PERFMON_STARTED")) { global $DB; $DB->ShowSqlStat = true; } } function OnAfterAfterEpilog() { if(defined("PERFMON_STARTED")) { $START_EXEC_CURRENT_TIME = microtime(); global $DB, $APPLICATION; $DB->ShowSqlStat = false; $sql_log = COption::GetOptionString("perfmon", "sql_log") === "Y"? "Y": "N"; $comps_count = 0; $comps_time = 0.0; $query_count = intval($DB->cntQuery); $query_time = $DB->timeQuery; foreach($APPLICATION->arIncludeDebug as $i => $ar) { $query_count += $ar["QUERY_COUNT"]; $query_time += $ar["QUERY_TIME"]; $comps_count++; $comps_time += $ar["TIME"]; } if($_SERVER["SCRIPT_NAME"] == "/bitrix/urlrewrite.php" && isset($_SERVER["REAL_FILE_PATH"])) $SCRIPT_NAME = $_SERVER["REAL_FILE_PATH"]; elseif($_SERVER["SCRIPT_NAME"] == "/404.php" && isset($_SERVER["REAL_FILE_PATH"])) $SCRIPT_NAME = $_SERVER["REAL_FILE_PATH"]; else $SCRIPT_NAME = $_SERVER["SCRIPT_NAME"]; $arFields = array( "~DATE_HIT" => $DB->GetNowFunction(), "IS_ADMIN" => defined("ADMIN_SECTION")? "Y": "N", "REQUEST_METHOD" => $_SERVER["REQUEST_METHOD"], "SERVER_NAME" => $_SERVER["SERVER_NAME"], "SERVER_PORT" => $_SERVER["SERVER_PORT"], "SCRIPT_NAME" => $SCRIPT_NAME, "REQUEST_URI" => $_SERVER["REQUEST_URI"], "INCLUDED_FILES" => function_exists("get_included_files")? count(get_included_files()): false, "MEMORY_PEAK_USAGE" => function_exists("memory_get_peak_usage")? memory_get_peak_usage(): false, "CACHE_TYPE" => COption::GetOptionString("main", "component_cache_on", "Y")=="Y"? "Y": "N", "~CACHE_SIZE" => intval($GLOBALS["CACHE_STAT_BYTES"]), "QUERIES" => $query_count, "~QUERIES_TIME" => $query_time, "SQL_LOG" => $sql_log, "COMPONENTS" => $comps_count, "~COMPONENTS_TIME" => $comps_time, "~MENU_RECALC" => $APPLICATION->_menu_recalc_counter, ); CPerfomanceKeeper::SetPageTimes($START_EXEC_CURRENT_TIME, $arFields); $HIT_ID = $DB->Add("b_perf_hit", $arFields); if($HIT_ID && ($sql_log === "Y") && is_array($DB->arQueryDebug)) { foreach($DB->arQueryDebug as $NN => $arQueryInfo) { $module_id = false; $comp_id = false; foreach($arQueryInfo["TRACE"] as $i => $arCallInfo) { if(array_key_exists("file", $arCallInfo)) { $file = strtolower(str_replace("\\", "/", $arCallInfo["file"])); if(!$module_id && substr($file, -12) != "database.php") { if(preg_match("#.*/bitrix/modules/(.+?)/#", $file, $match)) { $module_id = $match[1]; } } if(!$comp_id && preg_match("#.*/bitrix/components/(.+?)/(.+?)/#", $file, $match)) { $comp_id = $match[1].":".$match[2]; } if($module_id && $comp_id) break; } } $arFields = array( "HIT_ID" => $HIT_ID, "NN" => $NN, "QUERY_TIME" => $arQueryInfo["TIME"], "MODULE_NAME" => $module_id, "COMPONENT_NAME" => $comp_id, "SQL_TEXT" => $arQueryInfo["QUERY"], ); $SQL_ID = $DB->Add("b_perf_sql", $arFields, array("SQL_TEXT")); } foreach($APPLICATION->arIncludeDebug as $ii => $ar) { $arFields = array( "HIT_ID" => $HIT_ID, "NN" => $ii, "CACHE_TYPE" => $ar["CACHE_TYPE"], "CACHE_SIZE" => intval($ar["CACHE_SIZE"]), "COMPONENT_TIME" => $ar["TIME"], "QUERIES" => $ar["QUERY_COUNT"], "QUERIES_TIME" => $ar["QUERY_TIME"], "COMPONENT_NAME" => $ar["REL_PATH"], ); $COMP_ID = $DB->Add("b_perf_component", $arFields); foreach($ar["QUERIES"] as $N => $arQueryInfo) { $module_id = false; $comp_id = false; foreach($arQueryInfo["TRACE"] as $i => $arCallInfo) { if(array_key_exists("file", $arCallInfo)) { $file = strtolower(str_replace("\\", "/", $arCallInfo["file"])); if(!$module_id && substr($file, -12) != "database.php") { if(preg_match("#.*/bitrix/modules/(.+?)/#", $file, $match)) { $module_id = $match[1]; } } if(!$comp_id && preg_match("#.*/bitrix/components/(.+?)/(.+?)/#", $file, $match)) { $comp_id = $match[1].":".$match[2]; } if($module_id && $comp_id) break; } } $arFields = array( "HIT_ID" => $HIT_ID, "COMPONENT_ID" => $COMP_ID, "NN" => ++$NN, "QUERY_TIME" => $arQueryInfo["TIME"], "MODULE_NAME" => $module_id, "COMPONENT_NAME" => $comp_id, "SQL_TEXT" => $arQueryInfo["QUERY"], ); $SQL_ID = $DB->Add("b_perf_sql", $arFields, array("SQL_TEXT")); } } } global $perfmonErrors; if($HIT_ID && (count($perfmonErrors) > 0)) { foreach($perfmonErrors as $arError) { $arError["HIT_ID"] = $HIT_ID; $ERR_ID = $DB->Add("b_perf_error", $arError); } } $DB->ShowSqlStat = constant("PERFMON_STARTED"); } } function SetPageTimes($START_EXEC_CURRENT_TIME, &$arFields) { list($usec, $sec) = explode(" ", $START_EXEC_CURRENT_TIME); $CURRENT_TIME = $sec + $usec; if(defined("START_EXEC_PROLOG_BEFORE_1")) { list($usec, $sec) = explode(" ", START_EXEC_PROLOG_BEFORE_1); $PROLOG_BEFORE_1 = $sec + $usec; list($usec, $sec) = explode(" ", START_EXEC_AGENTS_2); $AGENTS_2 = $sec + $usec; list($usec, $sec) = explode(" ", START_EXEC_AGENTS_1); $AGENTS_1 = $sec + $usec; $arFields["~AGENTS_TIME"] = $AGENTS_2 - $AGENTS_1; if(defined("START_EXEC_PROLOG_AFTER_1")) { list($usec, $sec) = explode(" ", START_EXEC_PROLOG_AFTER_1); $PROLOG_AFTER_1 = $sec + $usec; list($usec, $sec) = explode(" ", START_EXEC_PROLOG_AFTER_2); $PROLOG_AFTER_2 = $sec + $usec; $arFields["~PROLOG_AFTER_TIME"] = $PROLOG_AFTER_2 - $PROLOG_AFTER_1; $arFields["~PROLOG_BEFORE_TIME"] = $PROLOG_AFTER_1 - $PROLOG_BEFORE_1; $arFields["~PROLOG_TIME"] = round($PROLOG_AFTER_2 - $PROLOG_BEFORE_1 - $arFields["~AGENTS_TIME"], 4); list($usec, $sec) = explode(" ", START_EXEC_EPILOG_BEFORE_1); $EPILOG_BEFORE_1 = $sec + $usec; $arFields["~WORK_AREA_TIME"] = $EPILOG_BEFORE_1 - $PROLOG_AFTER_2; list($usec, $sec) = explode(" ", START_EXEC_EPILOG_AFTER_1); $EPILOG_AFTER_1 = $sec + $usec; $arFields["~EPILOG_BEFORE_TIME"] = $EPILOG_AFTER_1 - $EPILOG_BEFORE_1; } list($usec, $sec) = explode(" ", START_EXEC_EVENTS_2); $EVENTS_2 = $sec + $usec; list($usec, $sec) = explode(" ", START_EXEC_EVENTS_1); $EVENTS_1 = $sec + $usec; $arFields["~EVENTS_TIME"] = $EVENTS_2 - $EVENTS_1; if(defined("START_EXEC_PROLOG_AFTER_1")) { $arFields["~EPILOG_AFTER_TIME"] = $CURRENT_TIME - $EPILOG_AFTER_1 - $arFields["~EVENTS_TIME"]; $arFields["~EPILOG_TIME"] = $CURRENT_TIME - $EPILOG_BEFORE_1; } $arFields["~PAGE_TIME"] = $CURRENT_TIME - $PROLOG_BEFORE_1; } else { $arFields["~PAGE_TIME"] = $CURRENT_TIME - START_EXEC_TIME; } } function IsActive() { $bActive = false; $rsEvents = GetModuleEvents("main", "OnPageStart"); while($arEvent = $rsEvents->Fetch()) { if($arEvent["TO_MODULE_ID"] == "perfmon") { $bActive = true; break; } } return $bActive; } function SetActive($bActive = false, $end_time = 0) { if($bActive) { if(!CPerfomanceKeeper::IsActive()) { RegisterModuleDependences("main", "OnPageStart", "perfmon", "CPerfomanceKeeper", "OnPageStart", "1"); RegisterModuleDependences("main", "OnEpilog", "perfmon", "CPerfomanceKeeper", "OnEpilog", "1000"); RegisterModuleDependences("main", "OnAfterEpilog", "perfmon", "CPerfomanceKeeper", "OnBeforeAfterEpilog", "1"); RegisterModuleDependences("main", "OnAfterEpilog", "perfmon", "CPerfomanceKeeper", "OnAfterAfterEpilog", "1000"); RegisterModuleDependences("main", "OnLocalRedirect", "perfmon", "CPerfomanceKeeper", "OnAfterAfterEpilog", "1000"); } COption::SetOptionInt("perfmon", "end_time", $end_time); } else { if(CPerfomanceKeeper::IsActive()) { UnRegisterModuleDependences("main", "OnPageStart", "perfmon", "CPerfomanceKeeper", "OnPageStart"); UnRegisterModuleDependences("main", "OnEpilog", "perfmon", "CPerfomanceKeeper", "OnEpilog"); UnRegisterModuleDependences("main", "OnAfterEpilog", "perfmon", "CPerfomanceKeeper", "OnBeforeAfterEpilog"); UnRegisterModuleDependences("main", "OnAfterEpilog", "perfmon", "CPerfomanceKeeper", "OnAfterAfterEpilog"); UnRegisterModuleDependences("main", "OnLocalRedirect", "perfmon", "CPerfomanceKeeper", "OnAfterAfterEpilog"); } } } } ?>