9 '/modules/main/classes/general/cache.php:150' =>
true,
11 $uni_file_name = str_replace(
'\\',
'/', mb_substr($errfile, mb_strlen(
$_SERVER[
'DOCUMENT_ROOT'] .
BX_ROOT)));
20 (mb_strpos($errstr,
'Undefined index:') ===
false)
21 && (mb_strpos($errstr,
'Undefined offset:') ===
false)
22 && !array_key_exists($uni_file_name .
':' . $errline, $arExclude)
36 'ERRFILE' => $errfile,
37 'ERRLINE' => $errline,
48 if (!defined(
'PERFMON_STOP'))
50 $end_time = COption::GetOptionInt(
'perfmon',
'end_time');
51 if (time() > $end_time)
54 if (COption::GetOptionString(
'perfmon',
'total_mark_value',
'') ==
'measure')
56 COption::SetOptionString(
'perfmon',
'total_mark_value',
'calc');
61 self::setDebugModeOn();
63 global $perfmonErrors;
65 if (COption::GetOptionString(
'perfmon',
'warning_log') ===
'Y')
67 set_error_handler(
'perfmonErrorHandler');
73 public static function setDebugModeOn()
77 define(
'PERFMON_STARTED',
$DB->ShowSqlStat .
'|' . \
Bitrix\Main\Data\Cache::getShowCacheStat() .
'|' .
$APPLICATION->ShowIncludeStat);
79 $DB->ShowSqlStat =
true;
84 \Bitrix\Main\Data\Cache::setShowCacheStat(COption::GetOptionString(
'perfmon',
'cache_log') ===
'Y');
92 $toRestore = explode(
'|', constant(
'PERFMON_STARTED'));
94 $DB->ShowSqlStat = $toRestore[0];
96 \Bitrix\Main\Data\Cache::setShowCacheStat($toRestore[1]);
102 if (defined(
'PERFMON_STARTED'))
110 if (defined(
'PERFMON_STARTED'))
113 $DB->ShowSqlStat =
true;
119 if (defined(
'PERFMON_STARTED'))
122 CPerfomanceKeeper::writeToDatabase();
126 public static function writeToDatabase()
128 $START_EXEC_CURRENT_TIME = microtime();
135 $DB->ShowSqlStat =
false;
138 $arQueryDebug =
$connection->getTracker()->getQueries();
148 $large_cache_size = floatval(COption::GetOptionString(
'perfmon',
'large_cache_size')) * 1024;
151 $slow_sql_time = floatval(COption::GetOptionString(
'perfmon',
'slow_sql_time'));
167 if ($sql_log || $cache_log)
174 $arCacheDebug =
null;
177 $arCacheDebug = \Bitrix\Main\Diag\CacheTracker::getCacheTracking();
179 if ($large_cache_log)
185 foreach ($arIncludeDebug as
$ar)
187 if (array_key_exists(
'REL_PATH',
$ar))
194 if (
$_SERVER[
'SCRIPT_NAME'] ==
'/bitrix/urlrewrite.php' && isset(
$_SERVER[
'REAL_FILE_PATH']))
196 $SCRIPT_NAME =
$_SERVER[
'REAL_FILE_PATH'];
200 $SCRIPT_NAME =
$_SERVER[
'REAL_FILE_PATH'];
204 $SCRIPT_NAME =
$_SERVER[
'SCRIPT_NAME'];
208 '~DATE_HIT' =>
$DB->GetNowFunction(),
209 'IS_ADMIN' => defined(
'ADMIN_SECTION') ?
'Y' :
'N',
210 'REQUEST_METHOD' =>
$_SERVER[
'REQUEST_METHOD'] ??
'',
211 'SERVER_NAME' =>
$_SERVER[
'SERVER_NAME'] ??
'',
212 'SERVER_PORT' =>
$_SERVER[
'SERVER_PORT'] ??
'',
213 'SCRIPT_NAME' => $SCRIPT_NAME,
214 'REQUEST_URI' =>
$_SERVER[
'REQUEST_URI'] ??
'',
215 'INCLUDED_FILES' => function_exists(
'get_included_files') ?
count(get_included_files()) :
false,
216 'MEMORY_PEAK_USAGE' => function_exists(
'memory_get_peak_usage') ? memory_get_peak_usage() :
false,
217 'CACHE_TYPE' => COption::GetOptionString(
'main',
'component_cache_on',
'Y') ==
'Y' ?
'Y' :
'N',
218 '~CACHE_SIZE' => intval(
$GLOBALS[
'CACHE_STAT_BYTES']),
219 '~CACHE_COUNT_R' => intval($cache_count[
'R'] ?? 0),
220 '~CACHE_COUNT_W' => intval($cache_count[
'W'] ?? 0),
221 '~CACHE_COUNT_C' => intval($cache_count[
'C'] ?? 0),
222 'QUERIES' => $query_count,
223 '~QUERIES_TIME' => $query_time,
224 'SQL_LOG' => $sql_log ?
'Y' :
'N',
225 'COMPONENTS' => $comps_count,
226 '~COMPONENTS_TIME' => $comps_time,
231 if ($query_count || $comps_count || $cache_count)
241 if ($HIT_ID && $cache_log)
247 if ($HIT_ID && $sql_log)
249 if (is_array($arQueryDebug))
255 if ($HIT_ID && ($sql_log || $cache_log))
257 foreach ($arIncludeDebug as $ii =>
$ar)
259 if (!array_key_exists(
'REL_PATH',
$ar))
273 'CACHE_TYPE' =>
$ar[
'CACHE_TYPE'],
274 '~CACHE_SIZE' => intval(
$ar[
'CACHE_SIZE']),
275 '~CACHE_COUNT_R' => intval($cache_count[
'R'] ?? 0),
276 '~CACHE_COUNT_W' => intval($cache_count[
'W'] ?? 0),
277 '~CACHE_COUNT_C' => intval($cache_count[
'C'] ?? 0),
278 'COMPONENT_TIME' =>
$ar[
'TIME'],
279 'QUERIES' =>
$ar[
'QUERY_COUNT'],
280 'QUERIES_TIME' =>
$ar[
'QUERY_TIME'],
281 'COMPONENT_NAME' =>
$ar[
'REL_PATH'],
285 if ($sql_log && is_array(
$ar[
'QUERIES']))
290 if ($cache_log && is_array(
$ar[
'CACHE']))
297 global $perfmonErrors;
298 if ($HIT_ID && (
count($perfmonErrors) > 0))
300 foreach ($perfmonErrors as $arError)
302 $arError[
'HIT_ID'] = $HIT_ID;
303 $DB->Add(
'b_perf_error', $arError);
310 list($usec, $sec) = explode(
' ', $START_EXEC_CURRENT_TIME);
311 $CURRENT_TIME = (float)$sec + (
float)$usec;
313 if (defined(
'START_EXEC_PROLOG_BEFORE_1'))
315 $PROLOG_BEFORE_1 = (float)START_EXEC_PROLOG_BEFORE_1;
317 if (defined(
'START_EXEC_AGENTS_1') && defined(
'START_EXEC_AGENTS_2'))
319 $AGENTS_2 = (float)constant(
'START_EXEC_AGENTS_2');
320 $AGENTS_1 = (float)constant(
'START_EXEC_AGENTS_1');
321 $arFields[
'~AGENTS_TIME'] = $AGENTS_2 - $AGENTS_1;
328 if (defined(
'START_EXEC_EVENTS_1') && defined(
'START_EXEC_EVENTS_2'))
330 list($usec, $sec) = explode(
' ', constant(
'START_EXEC_EVENTS_2'));
331 $EVENTS_2 = (float)$sec + (
float)$usec;
332 list($usec, $sec) = explode(
' ', constant(
'START_EXEC_EVENTS_1'));
333 $EVENTS_1 = (float)$sec + (
float)$usec;
334 $arFields[
'~EVENTS_TIME'] = $EVENTS_2 - $EVENTS_1;
341 if (defined(
'START_EXEC_PROLOG_AFTER_1') && defined(
'START_EXEC_PROLOG_AFTER_2'))
345 $arFields[
'~PROLOG_AFTER_TIME'] = $PROLOG_AFTER_2 - $PROLOG_AFTER_1;
347 $arFields[
'~PROLOG_BEFORE_TIME'] = $PROLOG_AFTER_1 - $PROLOG_BEFORE_1;
349 $arFields[
'~PROLOG_TIME'] = round($PROLOG_AFTER_2 - $PROLOG_BEFORE_1 -
$arFields[
'~AGENTS_TIME'], 4);
351 if (defined(
'START_EXEC_EPILOG_BEFORE_1'))
355 $arFields[
'~WORK_AREA_TIME'] = $EPILOG_BEFORE_1 - $PROLOG_AFTER_2;
357 if (defined(
'START_EXEC_EPILOG_AFTER_1'))
360 $arFields[
'~EPILOG_BEFORE_TIME'] = $EPILOG_AFTER_1 - $EPILOG_BEFORE_1;
361 $arFields[
'~EPILOG_AFTER_TIME'] = $CURRENT_TIME - $EPILOG_AFTER_1 -
$arFields[
'~EVENTS_TIME'];
369 $arFields[
'~EPILOG_TIME'] = $CURRENT_TIME - $EPILOG_BEFORE_1;
373 $arFields[
'~WORK_AREA_TIME'] = $CURRENT_TIME - $PROLOG_AFTER_2;
380 $arFields[
'~PAGE_TIME'] = $CURRENT_TIME - $PROLOG_BEFORE_1;
388 public static function removeQueries(&$arQueryDebug, &$arIncludeDebug, $slow_sql_time, $preserveComponents =
false)
390 if (is_array($arQueryDebug))
392 foreach ($arQueryDebug as
$i => $arQueryInfo)
394 if ($arQueryInfo[
'TIME'] < $slow_sql_time)
396 unset($arQueryDebug[
$i]);
401 if (is_array($arIncludeDebug))
403 foreach ($arIncludeDebug as
$i =>
$ar)
405 if (array_key_exists(
'REL_PATH',
$ar) && is_array(
$ar[
'QUERIES']))
407 foreach (
$ar[
'QUERIES'] as $N => $arQueryInfo)
409 if ($arQueryInfo[
'TIME'] < $slow_sql_time)
411 unset($arIncludeDebug[
$i][
'QUERIES'][$N]);
415 if (!$preserveComponents)
417 if (empty($arIncludeDebug[
$i][
'QUERIES']))
419 unset($arIncludeDebug[
$i]);
425 if (!$preserveComponents)
427 unset($arIncludeDebug[
$i]);
434 public static function countQueries(&$query_count, &$query_time, $arQueryDebug, $arIncludeDebug)
439 if (is_array($arQueryDebug))
441 foreach ($arQueryDebug as $arQueryInfo)
444 $query_time += $arQueryInfo[
'TIME'];
448 foreach ($arIncludeDebug as
$ar)
450 if (array_key_exists(
'REL_PATH',
$ar) && is_array(
$ar[
'QUERIES']))
452 foreach (
$ar[
'QUERIES'] as $arQueryInfo)
455 $query_time += $arQueryInfo[
'TIME'];
466 foreach ($arIncludeDebug as
$ar)
468 if (array_key_exists(
'REL_PATH',
$ar))
471 $comps_time +=
$ar[
'TIME'];
476 public static function removeCaches($large_cache_size, &$arCacheDebug, &$arIncludeDebug)
478 if (is_array($arCacheDebug))
480 foreach ($arCacheDebug as
$i => $arCacheInfo)
484 $arCacheInfo[
'cache_size'] > 0
485 && $arCacheInfo[
'cache_size'] < $large_cache_size
487 $arCacheInfo[
'operation'] !=
'W'
488 && $arCacheInfo[
'operation'] !=
'R'
492 unset($arCacheDebug[
$i]);
497 if (is_array($arIncludeDebug))
499 foreach ($arIncludeDebug as
$i =>
$ar)
501 if (array_key_exists(
'REL_PATH',
$ar) && isset(
$ar[
'CACHE']) && is_array(
$ar[
'CACHE']))
503 foreach (
$ar[
'CACHE'] as $N => $arCacheInfo)
507 $arCacheInfo[
'cache_size'] > 0
508 && $arCacheInfo[
'cache_size'] < $large_cache_size
510 $arCacheInfo[
'operation'] !=
'W'
511 && $arCacheInfo[
'operation'] !=
'R'
515 unset($arIncludeDebug[
$i][
'CACHE'][$N]);
523 public static function countCache($arCacheDebug, &$cache_count)
525 if (is_array($arCacheDebug))
527 foreach ($arCacheDebug as $arCacheInfo)
529 if (isset($cache_count[$arCacheInfo[
'operation']]))
531 $cache_count[$arCacheInfo[
'operation']]++;
535 $cache_count[$arCacheInfo[
'operation']] = 1;
545 foreach ($trace as $arCallInfo)
547 if (array_key_exists(
'file', $arCallInfo))
549 $file = mb_strtolower(str_replace(
'\\',
'/', $arCallInfo[
'file']));
553 && !preg_match(
'/\\/(database|cache|managedcache)\\.php$/', $file)
557 if (preg_match(
'#.*/bitrix/modules/(.+?)/#', $file, $match))
566 && preg_match(
'#.*/(?:bitrix|install)/components/(.+?)/(.+?)/#', $file, $match)
569 $comp_id = $match[1] .
':' . $match[2];
580 public static function saveQueries($HIT_ID, $COMP_ID, $arQueryDebug, &$NN)
584 foreach ($arQueryDebug as $arQueryInfo)
590 'COMPONENT_ID' => $COMP_ID,
592 'QUERY_TIME' => $arQueryInfo[
'TIME'],
593 'NODE_ID' => intval($arQueryInfo[
'NODE_ID']),
595 'COMPONENT_NAME' => $comp_id,
596 'SQL_TEXT' => $arQueryInfo[
'QUERY'],
597 'SELECTED_ROWS' => $arQueryInfo->getSelectedRowsCount(),
598 'SELECTED_FIELDS' => $arQueryInfo->getSelectedFieldsCount(),
599 'FETCHED_ROWS' => $arQueryInfo->getFetchedRowsCount(),
600 'FETCHED_LENGTH' => $arQueryInfo->getLength(),
601 'HAS_BIG_FIELDS' => $arQueryInfo->hasBigFields() ?
'Y' :
'N',
604 $SQL_ID =
$DB->Add(
'b_perf_sql',
$arFields, [
'SQL_TEXT']);
606 if ($SQL_ID && COption::GetOptionString(
'perfmon',
'sql_backtrace') ===
'Y')
608 $pl = mb_strlen(rtrim(
$_SERVER[
'DOCUMENT_ROOT'],
'/'));
609 foreach ($arQueryInfo[
'TRACE'] as
$i => $arCallInfo)
611 $DB->Add(
'b_perf_sql_backtrace', [
615 'FILE_NAME' => mb_substr($arCallInfo[
'file'], $pl),
616 'LINE_NO' => $arCallInfo[
'line'],
617 'CLASS_NAME' => $arCallInfo[
'class'],
618 'FUNCTION_NAME' => $arCallInfo[
'function'],
625 public static function saveCaches($HIT_ID, $COMP_ID, $arCacheDebug, &$NN)
629 foreach ($arCacheDebug as $arCacheInfo)
635 'COMPONENT_ID' => $COMP_ID,
637 'CACHE_SIZE' => $arCacheInfo[
'cache_size'],
638 'OP_MODE' => $arCacheInfo[
'operation'],
640 'COMPONENT_NAME' => $comp_id,
641 'BASE_DIR' => $arCacheInfo[
'basedir'],
642 'INIT_DIR' => $arCacheInfo[
'initdir'],
643 'FILE_NAME' => $arCacheInfo[
'filename'],
644 'FILE_PATH' => $arCacheInfo[
'path'],
655 if (isset($arEvent[
'TO_MODULE_ID']) && $arEvent[
'TO_MODULE_ID'] ==
'perfmon')
664 public static function SetActive($bActive =
false, $end_time = 0)
676 COption::SetOptionInt(
'perfmon',
'end_time', $end_time);
static getConnection($name="")
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
static countQueries(&$query_count, &$query_time, $arQueryDebug, $arIncludeDebug)
static SetActive($bActive=false, $end_time=0)
static findCaller($trace, &$module_id, &$comp_id)
static countCache($arCacheDebug, &$cache_count)
static removeQueries(&$arQueryDebug, &$arIncludeDebug, $slow_sql_time, $preserveComponents=false)
static countComponents(&$comps_count, &$comps_time, $arIncludeDebug)
static OnAfterAfterEpilog()
static OnBeforeAfterEpilog()
static removeCaches($large_cache_size, &$arCacheDebug, &$arIncludeDebug)
static saveCaches($HIT_ID, $COMP_ID, $arCacheDebug, &$NN)
static SetPageTimes($START_EXEC_CURRENT_TIME, &$arFields)
static saveQueries($HIT_ID, $COMP_ID, $arQueryDebug, &$NN)
static restoreDebugMode()
const START_EXEC_EPILOG_AFTER_1
const START_EXEC_EPILOG_BEFORE_1
perfmonErrorHandler($errno, $errstr, $errfile, $errline)
$_SERVER["DOCUMENT_ROOT"]
RegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $SORT=100, $TO_PATH="", $TO_METHOD_ARG=[])
UnRegisterModuleDependences($FROM_MODULE_ID, $MESSAGE_ID, $TO_MODULE_ID, $TO_CLASS="", $TO_METHOD="", $TO_PATH="", $TO_METHOD_ARG=[])
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
const START_EXEC_PROLOG_AFTER_1
const START_EXEC_PROLOG_AFTER_2($APPLICATION->GetShowIncludeAreas())
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
$GLOBALS['_____370096793']