Your IP : 172.28.240.42


Current Path : /var/www/html/clients/amz.e-nk.ru/bitrix/modules/perfmon/classes/general/
Upload File :
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");
			}
		}
	}
}
?>