diff --git a/class/class.debug.php b/class/class.debug.php index 775ae2a..6410ce5 100644 --- a/class/class.debug.php +++ b/class/class.debug.php @@ -2,7 +2,7 @@ // Проверка if (!defined("BASE_DIR")) { - exit("Access denied"); + exit("Access denied"); } /** @@ -21,1528 +21,1296 @@ if (!defined("BASE_DIR")) { class Debug { - protected static $time = []; - - protected static $memory = []; - - protected static $_debug = []; - - public static $_document_content = ""; - - public static $template_stack = []; - - public function __construct() - { - // - } - - /** - * Функция для вывода переменной (для отладки) - * - * @param mixed $var любая переменная - * @param bool $exit - * @param null $bg - * @param bool $echo - * - * @return false|null|string|string[] - */ - public static function _echo( - $var, - $exit = false, - $_bg = null, - $echo = true, - ) { - $code = ""; - - $backtrace = debug_backtrace(); - - $backtrace = $backtrace[0]; - - if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { - preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); - $file = $match[1]; - } - - $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); - - $line = 0; - - while (++$line <= $backtrace["line"]) { - $code = fgets($fh); - } - - fclose($fh); - - preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); - - unset($code, $backtrace); - - ob_start(); - - var_dump($var); - - $var_dump = ob_get_contents(); - - $var_dump = preg_replace('/=>(\s+|\s$)/', " => ", $var_dump); - - $var_dump = htmlspecialchars($var_dump); - - $var_dump = preg_replace( - "/(=>)/", - '$1', - $var_dump, - ); - - ob_end_clean(); - - if (!empty($name)) { - $fn_name = explode(",", $name[1]); - $fn_name = array_shift($fn_name); - } else { - $fn_name = "EVAL"; - } - - if ($_bg) { - $bg = 'style="background: #' . $_bg . ';"'; - } else { - $bg = ""; - } - - $var_dump = - ' - -
-
- var_dump(' . - trim($fn_name) . - ') -
- ' . - self::_trace() . - ' -
-
' .
-                  $var_dump .
-                  '
-
-
- '; - - if (!$echo) { - return $var_dump; - } - - echo $var_dump; - - if ($exit) { - exit(); - } - } - - /** - * Функция для вывода переменной (для отладки) - * - * @param mixed $var любая переменная - * @param bool $exit - * @param null $bg - * @param bool $echo - * - * @return null|string|string[] - */ - public static function _print( - $var, - $exit = false, - $_bg = null, - $echo = true, - ) { - $code = ""; - - $backtrace = debug_backtrace(); - - $backtrace = $backtrace[0]; - - if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { - preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); - $file = $match[1]; - } - - $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); - - $line = 0; - - while (++$line <= $backtrace["line"]) { - $code = fgets($fh); - } - - fclose($fh); - - preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); - - ob_start(); - - print_r($var); - - $var_dump = htmlspecialchars(ob_get_contents()); - - $var_dump = preg_replace( - "/(=>)/", - '$1', - $var_dump, - ); - - ob_end_clean(); - - if (!empty($name)) { - $fn_name = explode(",", $name[1]); - $fn_name = array_shift($fn_name); - } else { - $fn_name = "EVAL"; - } - - if ($_bg) { - $bg = 'style="background: #' . $_bg . ';"'; - } else { - $bg = ""; - } - - $var_dump = - ' - -
-
- print_r(' . - trim($fn_name) . - ') -
- ' . - self::_trace() . - ' -
-
' .
-                  $var_dump .
-                  '
-
-
- '; - - if (!$echo) { - return $var_dump; - } - - echo $var_dump; - - if ($exit) { - exit(); - } - } - - /** - * Функция для вывода переменной (для экспорта) - * - * @param mixed $var любая переменная - * @param bool $exit - * @param null $bg - * @param bool $echo - * - * @return string - */ - public static function _exp( - $var, - $exit = false, - $_bg = null, - $echo = true, - ) { - $code = ""; - - $backtrace = debug_backtrace(); - - $backtrace = $backtrace[0]; - - if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { - preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); - $file = $match[1]; - } - - $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); - - $line = 0; - - while (++$line <= $backtrace["line"]) { - $code = fgets($fh); - } - - fclose($fh); - - preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); - - ob_start(); - - var_export($var); - - if (!empty($name)) { - $fn_name = explode(",", $name[1]); - $fn_name = array_shift($fn_name); - } else { - $fn_name = "EVAL"; - } - - if ($_bg) { - $bg = 'style="background: #' . $_bg . ';"'; - } else { - $bg = ""; - } - - $var_export = htmlspecialchars(ob_get_contents()); - - $var_export = preg_replace( - "/(=>)/", - '$1', - $var_export, - ); - - ob_end_clean(); - - $var_dump = - ' - -
-
- var_export(' . - trim($fn_name) . - ') -
- ' . - self::_trace() . - ' -
-
' .
-                  $var_export .
-                  '
-
-
- '; - - if (!$echo) { - return $var_dump; - } - - echo $var_dump; - - if ($exit) { - exit(); - } - } - - /** - * Функция для вывода переменной (для отладки) - * - * @param mixed $var любая переменная - * @param bool $exit true - остановливает дальнейшее выполнение скрипта, false - продолжает выполнять скрипт - * @param null $bg - * @param bool $echo - * - * @return false|string - */ - public static function _html( - $var, - $exit = false, - $_bg = null, - $echo = true, - ) { - $code = ""; - - $backtrace = debug_backtrace(); - - $backtrace = $backtrace[0]; - - if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { - preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); - $file = $match[1]; - } - - $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); - - $line = 0; - - while (++$line <= $backtrace["line"]) { - $code = fgets($fh); - } - - fclose($fh); - - preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); - - ob_start(); - - var_export($var); - - if (!empty($name)) { - $fn_name = explode(",", $name[1]); - $fn_name = array_shift($fn_name); - } else { - $fn_name = "EVAL"; - } - - if ($_bg) { - $bg = 'style="background: #' . $_bg . ';"'; - } else { - $bg = ""; - } - - $var_dump = ob_get_contents(); - - ob_end_clean(); - - $var_dump = - ' - -
-
- var_export(' . - trim($fn_name) . - ') -
- ' . - self::_trace() . - ' -
-
' .
-                  htmlentities($var_dump, ENT_QUOTES) .
-                  '
-
-
- '; - - if (!$echo) { - return $var_dump; - } - - echo $var_dump; - - if ($exit) { - exit(); - } - } - - /** - * Функция для записи переменной в файл (для отладки) - * - * @param mixed $var любая переменная - * @param bool $exit true - остановливает дальнейшее выполнение скрипта, false - продолжает выполнять скрипт - * @param null $bg - * @param bool $append - */ - public static function _dump( - $var, - $exit = false, - $bg = null, - $append = true, - ) { - $code = ""; - - $backtrace = debug_backtrace(); - - $backtrace = $backtrace[0]; - - if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { - $file = preg_match( - "/([^\(]*)\((.*)\)/i", - $backtrace["file"], - $match, - ); - $file = $match[1]; - } - - $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); - - $line = 0; - - while (++$line <= $backtrace["line"]) { - $code = fgets($fh); - } - - fclose($fh); - - preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); - - ob_start(); - - var_dump($var); - - $var_dump = ob_get_contents(); - - $var_dump = preg_replace('/=>(\s+|\s$)/', " => ", $var_dump); - - $var_dump = htmlspecialchars($var_dump); - - $var_dump = preg_replace( - "/(=> )+([a-zA-Z]+\(\d+\))/", - '$1$2', - $var_dump, - ); - - ob_end_clean(); - - if (!empty($name)) { - $fn_name = explode(",", $name[1]); - $fn_name = array_shift($fn_name); - } else { - $fn_name = "EVAL"; - } - - if (!$bg) { - $br = "2a5885"; - $bg = "43648c"; - } else { - $br = $bg; - } - - $var_dump = - ' - -
-
- var_dump(' . - trim($fn_name) . - ') -
- ' . - self::_trace() . - ' -
-
' .
-                  $var_dump .
-                  '
-
-
- '; - - if ($append) { - file_put_contents( - BASE_DIR . "/debug.html", - $var_dump, - FILE_APPEND, - ); - } else { - file_put_contents(BASE_DIR . "/debug.html", $var_dump); - } - - if ($exit) { - exit(); - } - } - - /** - * Функция для вывода переменной (для отладки) - * - * @param mixed $var любая переменная - * @param bool $exit - * @param null $bg - * @param bool $echo - * - * @return false|null|string|string[] - */ - public static function _($var, $_bg = null, $from = "") - { - $code = ""; - - $backtrace = debug_backtrace(); - - $backtrace = $backtrace[0]; - - if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { - preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); - $file = $match[1]; - } - - $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); - - $line = 0; - - while (++$line <= $backtrace["line"]) { - $code = fgets($fh); - } - - fclose($fh); - - preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); - - unset($code, $backtrace); - - ob_start(); - - var_dump($var); - - $var_dump = ob_get_contents(); - - $var_dump = preg_replace('/=>(\s+|\s$)/', " => ", $var_dump); - - $var_dump = htmlspecialchars($var_dump); - - $var_dump = preg_replace( - "/(=>)/", - '$1', - $var_dump, - ); - - ob_end_clean(); - - if (!empty($name)) { - $fn_name = explode(",", $name[1]); - $fn_name = array_shift($fn_name); - } else { - $fn_name = "EVAL"; - } - - if ($_bg) { - $bg = 'style="background: #' . $_bg . ';"'; - } else { - $bg = ""; - } - - $var_dump = - ' - -
-
- var_dump(' . - trim($fn_name) . - ") " . - $from . - ' -
- ' . - self::_trace() . - ' -
-
' .
-                  $var_dump .
-                  '
-
-
- '; - - self::$_debug[] = $var_dump; - } - - /** - * Функция для трейсинга дебаггера - * - * @param - * @return string - */ - public static function _trace() - { - $bt = debug_backtrace(); - - $trace = $bt[1]; - - $line = $trace["line"]; - - $file = $trace["file"]; - - //$function = $trace['function']; - - $class = isset($bt[2]["class"]) ? $bt[2]["class"] : "None"; - - if (isset($bt[2]["class"])) { - $type = $bt[2]["type"]; - } else { - $type = "Unknow"; - } - - $function = isset($bt[2]["function"]) ? $bt[2]["function"] : "None"; - - return sprintf( - '
Class: %s | Type: %s | Function: %s
File: %s line %s
', - $class, - $type, - $function, - $file, - $line, - ); - } - - /** - * Функция отвечает за начало таймера - * - * @param string $name любая переменная (ключ массива) - */ - public static function startTime($name = "") - { - Debug::$time[$name] = microtime(true); - } - - /** - * Функция отвечает за окончание таймера - * - * @param string $name любая переменная (ключ массива) - * - * @return string - */ - public static function endTime($name = "") - { - if (isset(Debug::$time[$name])) { - return sprintf( - "%01.4f", - microtime(true) - Debug::$time[$name], - ) . " sec"; - } - } - - /** - * Функция отвечает за начало подсчета используеой памяти - * - * @param string $name любая переменная (ключ массива) - */ - public static function startMemory($name = "") - { - Debug::$memory[$name] = memory_get_usage(); - } - - /** - * Функция отвечает за окончание подсчета используемой памяти - * - * @param string $name любая переменная (ключ массива) - * @return string - */ - public static function endMemory($name = "") - { - if (isset(Debug::$memory[$name])) { - return Debug::formatSize( - memory_get_usage() - Debug::$memory[$name], - ); - } - } - - /** - * Форматированный вывод размера - * - * @param int $size размер - * @return string нормированный размер с единицой измерения - */ - public static function formatSize($size) - { - if ($size >= 1073741824) { - $size = round(($size / 1073741824) * 100) / 100 . " Gb"; - } elseif ($size >= 1048576) { - $size = round(($size / 1048576) * 100) / 100 . " Mb"; - } elseif ($size >= 1024) { - $size = round(($size / 1024) * 100) / 100 . " Kb"; - } else { - $size = $size . " b"; - } - - return $size; - } - - /** - * Форматированный вывод чисел - * - * @param int $number число - * @param int $decimal - * @param string $after - * @param string $thousand - * @return string - */ - public static function numFormat( - $number, - $decimal = 0, - $after = ",", - $thousand = ".", - ) { - if ($number) { - return number_format($number, $decimal, $after, $thousand); - } - - return ""; - } - - /** - * @param $header - * @param $body - * @param $caller - * @param bool $exit - */ - public static function _errorSql($header, $body, $caller, $exit = false) - { - // - } - - /** - * Вывод статистики - * - * @param null $type - * - * @return int|null|string - */ - public static function getStatistic($type = null) - { - global $AVE_DB; - - if (!defined("START_MEMORY")) { - define("START_MEMORY", memory_get_usage()); - } - - $stat = null; - - switch ($type) { - case "time": - $stat = number_format( - microtime_diff(START_MICROTIME, microtime()), - 3, - ",", - " ", - ); - break; - - case "memory": - $stat = Debug::formatSize( - memory_get_usage() - START_MEMORY, - ); - break; - - case "peak": - $stat = Debug::formatSize(memory_get_peak_usage()); - break; - - case "template": - // Извлекаем все возможные ключи модуля - $req_do = $_REQUEST["do"] ?? ""; - $req_mod = $_REQUEST["mod"] ?? ""; - $req_module = $_REQUEST["module"] ?? ""; - $action = $_REQUEST["action"] ?? ""; - - // Определяем имя модуля - if ($req_do == "modules" || $req_module == "modules") { - $real_mod = !empty($req_mod) - ? $req_mod - : ($req_module != "modules" - ? $req_module - : "system"); - $display_name = "modules → {$real_mod}"; - $current_context = $real_mod; + protected static $time = []; + protected static $memory = []; + protected static $_debug = []; + public static $_document_content = ""; + public static $template_stack = []; + + public function __construct() + { + // + } + + /** + * Функция для вывода переменной (для отладки) + * + * @param mixed $var любая переменная + * @param bool $exit + * @param null $bg + * @param bool $echo + * + * @return false|null|string|string[] + */ + public static function _echo( + $var, + $exit = false, + $_bg = null, + $echo = true, + ) { + $code = ""; + $backtrace = debug_backtrace(); + $backtrace = $backtrace[0]; + + if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { + preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); + $file = $match[1]; + } + + $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); + $line = 0; + + while (++$line <= $backtrace["line"]) { + $code = fgets($fh); + } + + fclose($fh); + preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); + unset($code, $backtrace); + + ob_start(); + var_dump($var); + $var_dump = ob_get_contents(); + $var_dump = preg_replace('/=>(\s+|\s$)/', " => ", $var_dump); + $var_dump = htmlspecialchars($var_dump); + $var_dump = preg_replace("/(=>)/", '$1', $var_dump); + ob_end_clean(); + + if (!empty($name)) { + $fn_name = explode(",", $name[1]); + $fn_name = array_shift($fn_name); + } else { + $fn_name = "EVAL"; + } + + if ($_bg) { + $bg = 'style="background: #' . $_bg . ';"'; + } else { + $bg = ""; + } + + $var_dump = ' + +
+
+ var_dump(' . trim($fn_name) . ') +
+ ' . self::_trace() . ' +
+
' . $var_dump . '
+
+
+ '; + + if (!$echo) { + return $var_dump; + } + + echo $var_dump; + + if ($exit) { + exit(); + } + } + + /** + * Функция для вывода переменной (для отладки) + * + * @param mixed $var любая переменная + * @param bool $exit + * @param null $bg + * @param bool $echo + * + * @return null|string|string[] + */ + public static function _print( + $var, + $exit = false, + $_bg = null, + $echo = true, + ) { + $code = ""; + $backtrace = debug_backtrace(); + $backtrace = $backtrace[0]; + + if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { + preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); + $file = $match[1]; + } + + $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); + $line = 0; + + while (++$line <= $backtrace["line"]) { + $code = fgets($fh); + } + + fclose($fh); + preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); + ob_start(); + print_r($var); + $var_dump = htmlspecialchars(ob_get_contents()); + $var_dump = preg_replace("/(=>)/", '$1', $var_dump); + ob_end_clean(); + + if (!empty($name)) { + $fn_name = explode(",", $name[1]); + $fn_name = array_shift($fn_name); + } else { + $fn_name = "EVAL"; + } + + if ($_bg) { + $bg = 'style="background: #' . $_bg . ';"'; + } else { + $bg = ""; + } + + $var_dump = ' + +
+
+ print_r(' . trim($fn_name) . ') +
+ ' . self::_trace() . ' +
+
' . $var_dump . '
+
+
+ '; + + if (!$echo) { + return $var_dump; + } + + echo $var_dump; + + if ($exit) { + exit(); + } + } + + /** + * Функция для вывода переменной (для экспорта) + * + * @param mixed $var любая переменная + * @param bool $exit + * @param null $bg + * @param bool $echo + * + * @return string + */ + public static function _exp( + $var, + $exit = false, + $_bg = null, + $echo = true, + ) { + $code = ""; + $backtrace = debug_backtrace(); + $backtrace = $backtrace[0]; + + if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { + preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); + $file = $match[1]; + } + + $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); + $line = 0; + + while (++$line <= $backtrace["line"]) { + $code = fgets($fh); + } + + fclose($fh); + preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); + ob_start(); + var_export($var); + + if (!empty($name)) { + $fn_name = explode(",", $name[1]); + $fn_name = array_shift($fn_name); + } else { + $fn_name = "EVAL"; + } + + if ($_bg) { + $bg = 'style="background: #' . $_bg . ';"'; + } else { + $bg = ""; + } + + $var_export = htmlspecialchars(ob_get_contents()); + $var_export = preg_replace("/(=>)/", '$1', $var_export); + ob_end_clean(); + + $var_dump = ' + +
+
+ var_export(' . trim($fn_name) . ') +
+ ' . self::_trace() . ' +
+
' . $var_export . '
+
+
+ '; + + if (!$echo) { + return $var_dump; + } + + echo $var_dump; + + if ($exit) { + exit(); + } + } + + /** + * Функция для вывода переменной (для отладки) + * + * @param mixed $var любая переменная + * @param bool $exit + * @param null $bg + * @param bool $echo + * + * @return false|string + */ + public static function _html( + $var, + $exit = false, + $_bg = null, + $echo = true, + ) { + $code = ""; + $backtrace = debug_backtrace(); + $backtrace = $backtrace[0]; + + if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { + preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); + $file = $match[1]; + } + + $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); + $line = 0; + + while (++$line <= $backtrace["line"]) { + $code = fgets($fh); + } + + fclose($fh); + preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); + ob_start(); + var_export($var); + + if (!empty($name)) { + $fn_name = explode(",", $name[1]); + $fn_name = array_shift($fn_name); + } else { + $fn_name = "EVAL"; + } + + if ($_bg) { + $bg = 'style="background: #' . $_bg . ';"'; + } else { + $bg = ""; + } + + $var_dump = ob_get_contents(); + ob_end_clean(); + + $var_dump = ' + +
+
+ var_export(' . trim($fn_name) . ') +
+ ' . self::_trace() . ' +
+
' . htmlentities($var_dump, ENT_QUOTES) . '
+
+
+ '; + + if (!$echo) { + return $var_dump; + } + + echo $var_dump; + + if ($exit) { + exit(); + } + } + + /** + * Функция для записи переменной в файл (для отладки) + * + * @param mixed $var любая переменная + * @param bool $exit true - остановливает дальнейшее выполнение скрипта, false - продолжает выполнять скрипт + * @param null $bg + * @param bool $append + */ + public static function _dump( + $var, + $exit = false, + $bg = null, + $append = true, + ) { + $code = ""; + $backtrace = debug_backtrace(); + $backtrace = $backtrace[0]; + + if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { + $file = preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); + $file = $match[1]; + } + + $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); + $line = 0; + + while (++$line <= $backtrace["line"]) { + $code = fgets($fh); + } + + fclose($fh); + preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); + ob_start(); + var_dump($var); + $var_dump = ob_get_contents(); + $var_dump = preg_replace('/=>(\s+|\s$)/', " => ", $var_dump); + $var_dump = htmlspecialchars($var_dump); + $var_dump = preg_replace("/(=> )+([a-zA-Z]+\(\d+\))/", '$1$2', $var_dump); + ob_end_clean(); + + if (!empty($name)) { + $fn_name = explode(",", $name[1]); + $fn_name = array_shift($fn_name); + } else { + $fn_name = "EVAL"; + } + + if (!$bg) { + $br = "2a5885"; + $bg = "43648c"; + } else { + $br = $bg; + } + + $var_dump = ' + +
+
+ var_dump(' . trim($fn_name) . ') +
+ ' . self::_trace() . ' +
+
' . $var_dump . '
+
+
+ '; + + if ($append) { + file_put_contents(BASE_DIR . "/debug.html", $var_dump, FILE_APPEND); + } else { + file_put_contents(BASE_DIR . "/debug.html", $var_dump); + } + + if ($exit) { + exit(); + } + } + + /** + * Функция для вывода переменной (для отладки) + * + * @param mixed $var любая переменная + * @param bool $exit + * @param null $bg + * @param bool $echo + * + * @return false|null|string|string[] + */ + public static function _($var, $_bg = null, $from = "") + { + $code = ""; + $backtrace = debug_backtrace(); + $backtrace = $backtrace[0]; + + if (preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"])) { + preg_match("/([^\(]*)\((.*)\)/i", $backtrace["file"], $match); + $file = $match[1]; + } + + $fh = fopen(isset($file) ? $file : $backtrace["file"], "r"); + $line = 0; + + while (++$line <= $backtrace["line"]) { + $code = fgets($fh); + } + + fclose($fh); + preg_match("/" . __FUNCTION__ . "\s*\((.*)\)\s*;/u", $code, $name); + unset($code, $backtrace); + + ob_start(); + var_dump($var); + $var_dump = ob_get_contents(); + $var_dump = preg_replace('/=>(\s+|\s$)/', " => ", $var_dump); + $var_dump = htmlspecialchars($var_dump); + $var_dump = preg_replace("/(=>)/", '$1', $var_dump); + ob_end_clean(); + + if (!empty($name)) { + $fn_name = explode(",", $name[1]); + $fn_name = array_shift($fn_name); + } else { + $fn_name = "EVAL"; + } + + if ($_bg) { + $bg = 'style="background: #' . $_bg . ';"'; + } else { + $bg = ""; + } + + $var_dump = ' + +
+
+ var_dump(' . trim($fn_name) . ') ' . $from . ' +
+ ' . self::_trace() . ' +
+
' . $var_dump . '
+
+
+ '; + + self::$_debug[] = $var_dump; + } + + /** + * Функция для трейсинга дебаггера + * + * @param + * @return string + */ + public static function _trace() + { + $bt = debug_backtrace(); + $trace = $bt[1]; + $line = $trace["line"]; + $file = $trace["file"]; + $class = isset($bt[2]["class"]) ? $bt[2]["class"] : "None"; + + if (isset($bt[2]["class"])) { + $type = $bt[2]["type"]; + } else { + $type = "Unknow"; + } + + $function = isset($bt[2]["function"]) ? $bt[2]["function"] : "None"; + + return sprintf( + '
Class: %s | Type: %s | Function: %s
File: %s line %s
', + $class, + $type, + $function, + $file, + $line, + ); + } + + /** + * Функция отвечает за начало таймера + * + * @param string $name любая переменная (ключ массива) + */ + public static function startTime($name = "") + { + Debug::$time[$name] = microtime(true); + } + + /** + * Функция отвечает за окончание таймера + * + * @param string $name любая переменная (ключ массива) + * + * @return string + */ + public static function endTime($name = "") + { + if (isset(Debug::$time[$name])) { + return sprintf("%01.4f", microtime(true) - Debug::$time[$name]) . " sec"; + } + } + + /** + * Функция отвечает за начало подсчета используемой памяти + * + * @param string $name любая переменная (ключ массива) + */ + public static function startMemory($name = "") + { + Debug::$memory[$name] = memory_get_usage(); + } + + /** + * Функция отвечает за окончание подсчета используемой памяти + * + * @param string $name любая переменная (ключ массива) + * @return string + */ + public static function endMemory($name = "") + { + if (isset(Debug::$memory[$name])) { + return Debug::formatSize(memory_get_usage() - Debug::$memory[$name]); + } + } + + /** + * Форматированный вывод размера + * + * @param int $size размер + * @return string нормированный размер с единицей измерения + */ + public static function formatSize($size) + { + if ($size >= 1073741824) { + $size = round(($size / 1073741824) * 100) / 100 . " Gb"; + } elseif ($size >= 1048576) { + $size = round(($size / 1048576) * 100) / 100 . " Mb"; + } elseif ($size >= 1024) { + $size = round(($size / 1024) * 100) / 100 . " Kb"; + } else { + $size = $size . " b"; + } + + return $size; + } + + /** + * Форматированный вывод чисел + * + * @param int $number число + * @param int $decimal + * @param string $after + * @param string $thousand + * @return string + */ + public static function numFormat( + $number, + $decimal = 0, + $after = ",", + $thousand = ".", + ) { + if ($number) { + return number_format($number, $decimal, $after, $thousand); + } + + return ""; + } + + /** + * @param $header + * @param $body + * @param $caller + * @param bool $exit + */ + public static function _errorSql($header, $body, $caller, $exit = false) + { + // + } + + /** + * Вывод статистики + * + * @param null $type + * + * @return int|null|string + */ + public static function getStatistic($type = null) + { + global $AVE_DB; + + if (!defined("START_MEMORY")) { + define("START_MEMORY", memory_get_usage()); + } + + $stat = null; + + switch ($type) { + case "time": + $stat = number_format(microtime_diff(START_MICROTIME, microtime()), 3, ",", " "); + break; + + case "memory": + $stat = Debug::formatSize(memory_get_usage() - START_MEMORY); + break; + + case "peak": + $stat = Debug::formatSize(memory_get_peak_usage()); + break; + + case "template": + // Извлекаем все возможные ключи модуля + $req_do = $_REQUEST["do"] ?? ""; + $req_mod = $_REQUEST["mod"] ?? ""; + $req_module = $_REQUEST["module"] ?? ""; + $action = $_REQUEST["action"] ?? ""; + + // Определяем имя модуля + if ($req_do == "modules" || $req_module == "modules") { + $real_mod = !empty($req_mod) ? $req_mod : ($req_module != "modules" ? $req_module : "system"); + $display_name = "modules → {$real_mod}"; + $current_context = $real_mod; + } else { + $display_name = !empty($req_module) ? $req_module : ($req_do ?: "index"); + $current_context = $display_name; + } + + $stat = "[{$display_name}]" . ($action ? " {$action}" : ""); + + if (!empty(self::$template_stack)) { + $tpls = array_unique(self::$template_stack); + + // Ищем целевой шаблон (Target) + $target = ""; + foreach ($tpls as $t) { + $pure = str_replace(".tpl", "", $t); + // Ищем совпадение с экшеном или именем модуля + if ($pure == $action || $pure == $current_context || ($current_context == "sysblocks" && $pure == "start")) { + $target = $t; + break; + } + } + + if (!$target) { + $rev = array_reverse($tpls); + foreach ($rev as $t) { + if (!in_array($t, ["main.tpl", "cp_links.tpl", "header.tpl", "footer.tpl"])) { + $target = $t; + break; + } + } + } + + $stack_output = []; + foreach ($tpls as $t) { + if ($t === $target) { + $stack_output[] = "{$t}"; } else { - $display_name = !empty($req_module) - ? $req_module - : ($req_do ?: - "index"); - $current_context = $display_name; + $stack_output[] = "{$t}"; } + } + $stat .= " | " . implode(' ', $stack_output); + } + break; - $stat = - "[{$display_name}]" . - ($action - ? " {$action}" - : ""); + case "sqlcount": + $stat = $AVE_DB->DBProfilesGet("count"); + break; - if (!empty(self::$template_stack)) { - $tpls = array_unique(self::$template_stack); + case "sqltrace": + $stat = count($AVE_DB->_query_list); + break; - // Ищем целевой шаблон (Target) - $target = ""; - foreach ($tpls as $t) { - $pure = str_replace(".tpl", "", $t); - // Ищем совпадение с экшеном или именем модуля - if ( - $pure == $action || - $pure == $current_context || - ($current_context == "sysblocks" && - $pure == "start") - ) { - $target = $t; - break; - } - } + case "sqltime": + $stat = $AVE_DB->DBProfilesGet("time"); + break; - if (!$target) { - $rev = array_reverse($tpls); - foreach ($rev as $t) { - if ( - !in_array($t, [ - "main.tpl", - "cp_links.tpl", - "header.tpl", - "footer.tpl", - ]) - ) { - $target = $t; - break; - } - } - } + case "get": + $stat = self::_stat_get("get"); + break; - $stack_output = []; - foreach ($tpls as $t) { - if ($t === $target) { - $stack_output[] = "{$t}"; - } else { - $stack_output[] = "{$t}"; - } - } - $stat .= - " | " . - implode( - ' ', - $stack_output, - ); - } - break; + case "post": + $stat = self::_stat_get("post"); + break; - case "sqlcount": - $stat = $AVE_DB->DBProfilesGet("count"); - break; + case "request": + $stat = self::_stat_get("request"); + break; - case "sqltrace": - $stat = count($AVE_DB->_query_list); - break; + case "files": + $stat = self::_stat_get("files"); + break; - case "sqltime": - $stat = $AVE_DB->DBProfilesGet("time"); - break; + case "cookie": + $stat = self::_stat_get("cookie"); + break; - case "get": - $stat = self::_stat_get("get"); - break; + case "env": + $stat = self::_stat_get("env"); + break; - case "post": - $stat = self::_stat_get("post"); - break; + case "session": + $stat = self::_stat_get("session"); + break; - case "request": - $stat = self::_stat_get("request"); - break; + case "server": + $stat = self::_stat_get("server"); + break; - case "files": - $stat = self::_stat_get("files"); - break; + case "globals": + $stat = self::_stat_get("globals"); + break; - case "cookie": - $stat = self::_stat_get("cookie"); - break; + case "blocks": + $stat = self::_stat_get("blocks"); + break; + } - case "env": - $stat = self::_stat_get("env"); - break; + return $stat; + } - case "session": - $stat = self::_stat_get("session"); - break; + /** + * @param string $type + * + * @return false|null|string|string[] + */ + public static function _stat_get(string $type = "get") + { + ob_start(); - case "server": - $stat = self::_stat_get("server"); - break; - - case "globals": - $stat = self::_stat_get("globals"); - break; - - case "blocks": - $stat = self::_stat_get("blocks"); - break; + if ($type == "get") { + var_dump($_GET); + } elseif ($type == "post") { + var_dump($_POST); + } elseif ($type == "request") { + var_dump($_REQUEST); + } elseif ($type == "files") { + var_dump($_FILES); + } elseif ($type == "cookie") { + var_dump($_COOKIE); + } elseif ($type == "session") { + var_dump($_SESSION); + } elseif ($type == "server") { + var_dump($_SERVER); + } elseif ($type == "env") { + var_dump($_ENV); + } elseif ($type == "globals") { + var_dump($GLOBALS); + } elseif ($type == "blocks") { + if (isset($GLOBALS["block_generate"])) { + var_dump($GLOBALS["block_generate"]); } + } + $stat = ob_get_contents(); + $stat = preg_replace('/=>(\s+|\s$)/', " => ", $stat); + $stat = htmlspecialchars($stat); + $stat = preg_replace("/(=>)/", '$1', $stat); + $stat = '
' . $stat . "
"; - return $stat; - } + ob_end_clean(); - /** - * @param string $type - * - * @return false|null|string|string[] - */ - public static function _stat_get(string $type = "get") - { - ob_start(); + return $stat; + } - if ($type == "get") { - var_dump($_GET); - } elseif ($type == "post") { - var_dump($_POST); - } elseif ($type == "request") { - var_dump($_REQUEST); - } elseif ($type == "files") { - var_dump($_FILES); - } elseif ($type == "cookie") { - var_dump($_COOKIE); - } elseif ($type == "session") { - var_dump($_SESSION); - } elseif ($type == "server") { - var_dump($_SERVER); - } elseif ($type == "env") { - var_dump($_ENV); - } elseif ($type == "globals") { - var_dump($GLOBALS); - } elseif ($type == "blocks") { - if (isset($GLOBALS["block_generate"])) { - var_dump($GLOBALS["block_generate"]); - } + public static function getDocumentInfo() + { + global $AVE_Template; + + $_arr = [ + "DOC" => "/admin/index.php?do=docs&action=edit&Id=", + "RUBRIC" => "/admin/index.php?do=rubs&action=edit&Id=", + "BLOCKS" => "/admin/index.php?do=blocks&action=edit&id=", + "SYSBLOCK" => "/admin/index.php?do=sysblocks&action=edit&id=", + "REQUESTS" => "/admin/index.php?do=request&action=edit&Id=", + "NAVIAGTIONS" => "/admin/index.php?do=navigation&action=templates&navigation_id=", + ]; + + // ИСПРАВЛЕНИЕ : Безопасно получаем 'id' из $_REQUEST + $doc = get_document($_REQUEST["id"] ?? ""); + + $_edit = []; + + // ИСПРАВЛЕНИЕ : Проверяем, что $doc содержит данные и нужные ключи + if (!empty($doc) && isset($doc["Id"], $doc["rubric_id"])) { + $_edit["DOC"][$doc["Id"]] = $_arr["DOC"] . $doc["Id"]; + $_edit["RUBRIC"][$doc["rubric_id"]] = $_arr["RUBRIC"] . $doc["rubric_id"]; + } + + // ИСПРАВЛЕНИЕ : Проверяем, что $GLOBALS['block_generate'] существует и является массивом/объектом + if (isset($GLOBALS["block_generate"]) && (is_array($GLOBALS["block_generate"]) || $GLOBALS["block_generate"] instanceof Traversable)) { + foreach ($GLOBALS["block_generate"] as $k => $v) { + if (!in_array($k, array_keys($_arr))) { + continue; + } + + // Защита внутреннего цикла + if (is_array($v) || $v instanceof Traversable) { + foreach ($v as $key => $value) { + $_edit[$k][$key] = $_arr[$k] . $key; + } + } } - $stat = ob_get_contents(); - $stat = preg_replace('/=>(\s+|\s$)/', " => ", $stat); - $stat = htmlspecialchars($stat); - $stat = preg_replace( - "/(=>)/", - '$1', - $stat, - ); - $stat = - '
' .
-                  $stat .
-                  "
"; + } - ob_end_clean(); + $AVE_Template->assign("edit", $_edit); + $AVE_Template->assign("session", session_id()); - return $stat; - } + $return = $AVE_Template->fetch(BASE_DIR . "/lib/debug/debug.tpl"); - public static function getDocumentInfo() - { - global $AVE_Template; + return $return; + } - $_arr = [ - "DOC" => "/admin/index.php?do=docs&action=edit&Id=", - "RUBRIC" => "/admin/index.php?do=rubs&action=edit&Id=", - "BLOCKS" => "/admin/index.php?do=blocks&action=edit&id=", - "SYSBLOCK" => "/admin/index.php?do=sysblocks&action=edit&id=", - "REQUESTS" => "/admin/index.php?do=request&action=edit&Id=", - "NAVIAGTIONS" => - "/admin/index.php?do=navigation&action=templates&navigation_id=", - ]; + /** + * Вывод отладочной информации + * Поддерживает режимы: off, full, tpl + * @param string|null $force_mode Принудительный режим + * @return string + */ + public static function displayInfo($force_mode = null): string + { + global $AVE_DB; - // ИСПРАВЛЕНИЕ : Безопасно получаем 'id' из $_REQUEST - $doc = get_document($_REQUEST["id"] ?? ""); + // 1. ОПРЕДЕЛЕНИЕ РЕЖИМА (Паблик vs Админка) + if ($force_mode !== null) { + $mode = $force_mode; + } elseif (defined("ACP") && defined("PROFILING_ADMIN")) { + // Режим для панели управления + $mode = PROFILING_ADMIN; + } elseif (defined("PROFILING")) { + // Режим для публичной части + $mode = PROFILING; + } else { + $mode = "off"; + } - $_edit = []; + // 2. ЕСЛИ ВЫКЛЮЧЕНО + if ($mode === "off" || $mode === false || $mode === "0") { + return ""; + } - // ИСПРАВЛЕНИЕ : Проверяем, что $doc содержит данные и нужные ключи - if (!empty($doc) && isset($doc["Id"], $doc["rubric_id"])) { - $_edit["DOC"][$doc["Id"]] = $_arr["DOC"] . $doc["Id"]; - $_edit["RUBRIC"][$doc["rubric_id"]] = - $_arr["RUBRIC"] . $doc["rubric_id"]; - } + // РЕЖИМ ТОЛЬКО ШАБЛОН + if ($mode === "tpl") { + $id = 'stats_plate_' . uniqid(); + return ' +
+ ' . self::getStatistic("template") . ' +
+ '; + } - // 2. ЕСЛИ ВЫКЛЮЧЕНО - if ($mode === "off" || $mode === false || $mode === "0") { - return ""; - } + // РЕЖИМ FULL + $out = PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= '
'; + $out .= PHP_EOL; + $out .= ' +
+ + '; + $out .= PHP_EOL; + $out .= '
' . PHP_EOL; - // 3. РЕЖИМ ТОЛЬКО ШАБЛОН (Минималистичный вывод) - if ($mode === "tpl") { - return ' -
- ' . - self::getStatistic("template") . - ' -
'; - } + // Выводим имя шаблона в первой вкладке + $out .= "Template: " . self::getStatistic("template") . "
"; + $out .= "Time generation: " . self::getStatistic("time") . " sec"; + $out .= "
"; + $out .= "Memory usage: " . self::getStatistic("memory"); + $out .= "
"; + $out .= "Memory peak usage: " . self::getStatistic("peak"); + $out .= "
"; + $out .= "Real SQL Queries: " . $AVE_DB->DBProfilesGet("count") . " for " . $AVE_DB->DBProfilesGet("time") . " sec"; + $out .= "
"; + $out .= "All SQL Queries: " . (is_array($AVE_DB->_query_list) || $AVE_DB->_query_list instanceof Countable ? count($AVE_DB->_query_list) : 0); + $out .= "
"; - // 4. РЕЖИМ FULL (Твой стандартный дебаг-бар) - $out = PHP_EOL; - $out .= ''; - $out .= PHP_EOL; - $out .= - ''; - $out .= PHP_EOL; - $out .= ''; - $out .= PHP_EOL; - $out .= '
'; - $out .= PHP_EOL; - $out .= ' -
- - '; - $out .= PHP_EOL; - $out .= - '
' . - PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - // Выводим имя шаблона в первой вкладке - $out .= - "Template: " . - self::getStatistic("template") . - "
"; + $out .= PHP_EOL; + $out .= '"; - $out .= "Time generation: " . self::getStatistic("time") . " sec"; - $out .= "
"; - $out .= "Memory usage: " . self::getStatistic("memory"); - $out .= "
"; - $out .= "Memory peak usage: " . self::getStatistic("peak"); - $out .= "
"; - $out .= - "Real SQL Queries: " . - $AVE_DB->DBProfilesGet("count") . - " for " . - $AVE_DB->DBProfilesGet("time") . - " sec"; - $out .= "
"; - $out .= - "All SQL Queries: " . - (is_array($AVE_DB->_query_list) || - $AVE_DB->_query_list instanceof Countable - ? count($AVE_DB->_query_list) - : 0); - $out .= "
"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= "
"; - $out .= PHP_EOL; + return $out; + } - $out .= - '"; + /** + * @return string + */ + public static function displayInfoLight(): string + { + global $AVE_DB; - $out .= PHP_EOL; + $out = PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= ''; + $out .= PHP_EOL; + $out .= '
'; + $out .= PHP_EOL; + $out .= ' +
+ + '; + $out .= PHP_EOL; + $out .= '
' . PHP_EOL; + $out .= "Time generation: " . self::getStatistic("time") . " sec"; + $out .= "
"; + $out .= "Memory usage: " . self::getStatistic("memory"); + $out .= "
"; + $out .= "Memory peak usage: " . self::getStatistic("peak"); + $out .= "
"; + $out .= "Real SQL Queries: " . $AVE_DB->DBProfilesGet("count") . " for " . $AVE_DB->DBProfilesGet("time") . " sec"; + $out .= "
"; + $out .= "All SQL Queries: " . (is_array($AVE_DB->_query_list) || $AVE_DB->_query_list instanceof Countable ? count($AVE_DB->_query_list) : 0); + $out .= "
"; - $out .= - '"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= '"; - $out .= PHP_EOL; + $out .= PHP_EOL; + $out .= '"; - $out .= - '"; + $out .= PHP_EOL; + $out .= "
"; - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= "
"; - - return $out; - } - - /** - * @return string - */ - public static function displayInfoLight(): string - { - global $AVE_DB; - - $out = PHP_EOL; - $out .= ''; - $out .= PHP_EOL; - $out .= - ''; - $out .= PHP_EOL; - $out .= ''; - $out .= PHP_EOL; - $out .= '
'; - $out .= PHP_EOL; - $out .= ' -
- - '; - $out .= PHP_EOL; - $out .= - '
' . - PHP_EOL; - $out .= "Time generation: " . self::getStatistic("time") . " sec"; - $out .= "
"; - $out .= "Memory usage: " . self::getStatistic("memory"); - $out .= "
"; - $out .= "Memory peak usage: " . self::getStatistic("peak"); - $out .= "
"; - $out .= - "Real SQL Queries: " . - $AVE_DB->DBProfilesGet("count") . - " for " . - $AVE_DB->DBProfilesGet("time") . - " sec"; - $out .= "
"; - $out .= - "All SQL Queries: " . - (is_array($AVE_DB->_query_list) || - $AVE_DB->_query_list instanceof Countable - ? count($AVE_DB->_query_list) - : 0); - $out .= "
"; - - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= - '"; - - $out .= PHP_EOL; - $out .= "
"; - - return $out; - } + return $out; + } } ?> \ No newline at end of file