Файл debug.php в Cotonti

Файл debug.php в системной папке Cotonti CMF предназначен для организации удобных механизмов отладки и логирования, позволяя разработчикам выводить подробную информацию о текущем состоянии переменных, стека вызовов и других аспектов выполнения программы.

Основные функции и их назначение:

  1. cot_print() — Эта функция принимает несколько переменных и выводит их значения в формате var_dump(), что позволяет детально увидеть тип и содержимое каждой переменной. После вывода данных выполнение скрипта завершается с помощью die(). Это используется для быстрой отладки, чтобы понять, что содержат переменные на определенном этапе выполнения кода.

  2. cot_watch() — Записывает текущее состояние переданных переменных в файл лога. При этом информация о вызове функции (имя файла и номер строки) также записывается. Это используется для того, чтобы сохранять информацию о переменных для дальнейшего анализа без остановки выполнения скрипта.

  3. cot_backtrace() — Выводит стек вызовов (backtrace), который помогает отследить путь выполнения программы до точки вызова. Это полезно, если нужно понять, как и откуда был вызван код.

  4. cot_vardump() — Печатает структуру и содержимое всех глобальных переменных, которые доступны в текущей области видимости. Это помогает разработчикам увидеть все переменные, включая глобальные, и оценить их состояние.

  5. COT_VARDUMP_LOCALS — Макрос, который выводит все локальные переменные в текущей области видимости, с исключением некоторых служебных переменных. Это помогает получить подробное представление о текущем контексте выполнения скрипта.

  6. cot_checkpoint() — Записывает в лог-файл текущее состояние всех глобальных переменных, а также информацию о том, где именно в коде был вызван этот процесс (имя файла и строка). Это полезно для отладки в реальном времени, особенно когда важно сохранить информацию о переменных на определенном этапе выполнения.

  7. COT_CHECKPOINT_LOCALS — Макрос, который записывает в лог файл текущее состояние всех локальных переменных в области видимости с исключением некоторых служебных переменных. Это помогает отслеживать изменения переменных в ходе выполнения кода.

Стиль PHP:

  1. Глобальные переменные:

    • В коде активно используются глобальные переменные, такие как $cfg, $GLOBALS и другие. Это типичный подход для работы с конфигурациями или состоянием системы в более старых или простых системах.
  2. Отладочные функции:

    • Функции типа var_dump(), print_r() и debug_backtrace() являются стандартными средствами для отладки в PHP, и их использование здесь помогает разработчикам получить подробную информацию о значениях переменных и о контексте вызовов.
  3. Использование ob_end_clean():

    • Это стандартный прием в PHP для очистки вывода перед тем, как вывести отладочную информацию. Он предотвращает появление лишних данных, если вывод был уже начат.
  4. Запись в файл:

    • В нескольких местах используется запись информации в лог-файл с уникальными именами, содержащими дату и время. Это позволяет отслеживать состояние системы на протяжении времени и восстанавливать последовательность событий.
  5. Макросы:

    • Использование define для создания макросов, таких как COT_VARDUMP_LOCALS и COT_CHECKPOINT_LOCALS, позволяет вставлять отладочный код в различных частях приложения, без необходимости многократного написания однотипного кода.

Характеристика стиля кода:

  • Простота и ясность: Код написан в легком для понимания стиле. Он использует стандартные функции PHP для отладки, записи в файл и получения стека вызовов.
  • Минимизация ошибок: Через использование функции записи в лог и различных макросов система предоставляет механизмы для детальной диагностики, что позволяет легко отслеживать ошибки на разных этапах выполнения.
  • Гибкость: Код позволяет настраивать вывод отладочной информации в зависимости от условий, например, с помощью флагов типа $clear_screen, а также создает уникальные имена для файлов логов, чтобы сохранить все логи.

В целом, файл debug.php реализует набор полезных инструментов для отладки и мониторинга работы системы, позволяя разработчикам получать детальную информацию о переменных, стеке вызовов и текущем состоянии кода, что важно для поиска ошибок и улучшения производительности.

В файле debug.php в системной папке Cotonti CMF содержатся следующие функции:

  1. cot_print()
    Печатает значения переданных переменных с использованием var_dump() и завершает выполнение скрипта.

  2. cot_watch()
    Записывает текущее состояние переданных переменных и стека вызовов в лог-файл и продолжает выполнение скрипта.

  3. cot_backtrace()
    Выводит стек вызовов программы, позволяя отследить путь выполнения кода до текущей точки.

  4. cot_vardump()
    Печатает структуру и содержимое всех глобальных переменных, доступных в текущей области видимости.

  5. COT_VARDUMP_LOCALS (макрос)
    Макрос, который выводит структуру и содержимое всех локальных переменных в текущей области видимости.

  6. cot_checkpoint()
    Записывает текущее состояние всех глобальных переменных в лог-файл и продолжает выполнение скрипта.

  7. COT_CHECKPOINT_LOCALS (макрос)
    Макрос, который записывает текущее состояние всех локальных переменных в лог-файл и продолжает выполнение скрипта.

Эти функции и макросы предназначены для отладки и логирования состояния переменных и других параметров во время работы приложения.

 

 

/**
 * Debugging Facilities
 *
 * @package API - Debugging
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */
 
// Проверка, был ли файл вызван через систему Cotonti. Если нет, прекращаем выполнение.
defined('COT_CODE') or die('Wrong URL');

// Установка уровня отчетности об ошибках. Все ошибки, кроме NOTICE, будут показываться.
error_reporting(E_ALL ^ E_NOTICE);

// Включаем отображение ошибок на экране.
ini_set('display_errors', 1);

/**
 * Принимает несколько переменных и выводит их значения в режиме отладки (с помощью var_dump).
 *
 * @example cot_assert($foo, $bar);
 * @see cot_watch(), cot_backtrace(), cot_vardump()
 */
function cot_print()  // Объявление функции cot_print, которая выводит значения переданных переменных.
{
	ob_end_clean();  // Очищаем выходной буфер и завершаем его, чтобы не было лишних выводов перед использованием функции.
	$vars = func_get_args();  // Получаем все аргументы, переданные в функцию, и сохраняем их в массив $vars.
	foreach ($vars as $name => $var)  // Перебираем все переданные переменные.
	{
		var_dump($var);  // Выводим информацию о переменной в формате var_dump (тип, значение и другие данные).
	}
	die();  // Завершаем выполнение скрипта сразу после вывода переменных, чтобы ничего не продолжало выполняться.
}

Описание:

  1. Проверка правильности вызова файла: В самом начале используется проверка через defined('COT_CODE') для того, чтобы убедиться, что файл вызван из правильного контекста системы Cotonti. Если условие не выполняется (то есть файл был вызван напрямую), выполнение скрипта будет остановлено через die('Wrong URL').

  2. Настройка отчетности об ошибках: Функция error_reporting(E_ALL ^ E_NOTICE) настраивает отчетность об ошибках, показывая все ошибки, кроме уведомлений E_NOTICE. Это полезно для отладки, так как E_NOTICE часто выводит незначительные уведомления, которые могут быть полезны в процессе разработки, но мешают на стадии отладки. Включение ini_set('display_errors', 1) заставляет PHP отображать эти ошибки непосредственно в браузере.

  3. Основная функция отладки - cot_print(): Эта функция принимает переменные, переданные ей в виде аргументов. Она очищает выходной буфер через ob_end_clean() (это позволяет избежать лишнего вывода перед использованием этой функции), затем выводит каждую переменную через var_dump() и завершает выполнение скрипта с помощью die(). Это гарантирует, что после вывода данных выполнение скрипта не продолжится.

В коде используется типичная для отладки практика вывода данных с помощью var_dump, что помогает разработчику анализировать структуру данных в процессе отладки.


 

/**
 * Записывает текущее состояние своих аргументов в файл лога отладки и продолжает нормальное выполнение скрипта.
 *
 * @global string $cfg['debug_logpath'] Путь к файлу лога отладки
 * @example cot_watch($foo, $bar);
 * @see cot_assert(), cot_checkpoint()
 */
function cot_watch()  // Объявление функции cot_watch, которая записывает состояние своих аргументов в файл лога отладки.
{
	global $cfg;  // Делаем доступной глобальную переменную $cfg, которая содержит конфигурационные данные.

	// Открываем файл для записи в режиме "добавить в конец файла" (a) в путь, указанный в конфигурации.
	// Формируем имя файла, добавляя текущую дату и время для уникальности (Ymd_His).
	$fp = fopen($cfg['debug_logpath'] . '/cot_debug_' . date('Ymd_His') . '.log', 'a');  

	$btrace = debug_backtrace();  // Получаем стек вызовов функций, чтобы записать место в коде, где была вызвана эта функция.
	
	// Записываем в файл имя файла и строку, где был вызван код, используя данные из стека вызова.
	fputs($fp, $btrace[0]['file'].', '.$btrace[0]['line'].":\n");

	// Получаем все аргументы, переданные в функцию, и начинаем их обработку.
	$vars = func_get_args();  
	foreach ($vars as $name => $var)  // Перебираем все переданные переменные.
	{
		// Записываем каждую переменную в файл, используя print_r для получения строкового представления данных.
		// TRUE в функции print_r используется для того, чтобы вывести результат как строку.
		fputs($fp, "arg #$name = ".print_r($var, TRUE)."\n");
	}
	
	// Записываем разделитель для удобства чтения в логе.
	fputs($fp, "----------------\n");

	// Закрываем файл после записи.
	fclose($fp);
}

Описание:

  1. Глобальная переменная: Функция использует глобальную переменную $cfg, которая хранит конфигурационные данные, в частности путь к лог-файлу отладки ($cfg['debug_logpath']).

  2. Открытие файла для записи: Внутри функции открывается файл лога для записи с именем, состоящим из префикса cot_debug_ и текущей даты и времени (Ymd_His), чтобы избежать перезаписывания старых данных. Файл открывается в режиме добавления ('a'), что позволяет добавлять новые данные в конец файла.

  3. Получение стека вызовов: debug_backtrace() извлекает стек вызовов функций. Это позволяет получить информацию о том, в каком файле и на какой строке был вызван этот код, что полезно для отладки.

  4. Запись данных в файл: В файл записывается информация о месте вызова функции, а затем для каждого переданного аргумента записывается его строковое представление с помощью print_r(). Аргументы записываются в файл с нумерацией, чтобы было понятно, какой аргумент был передан в каком порядке.

  5. Закрытие файла: После того как все данные записаны, файл закрывается с помощью fclose().

Этот код используется для того, чтобы записывать состояние переменных и места их вызова в лог-файл, что может быть полезно для отладки в процессе работы системы, без остановки выполнения программы.


/**
 * Выводит стек вызовов программы.
 *
 * @param bool $clear_screen Если TRUE, выводит только стек вызовов. В противном случае вывод будет отображен в обычном потоке.
 * @see cot_assert(), cot_vardump()
 */
function cot_backtrace($clear_screen = TRUE)  // Объявление функции cot_backtrace с параметром $clear_screen, который контролирует вывод.
{
	if ($clear_screen)  // Проверяем, нужно ли очищать экран перед выводом.
	{
		ob_end_clean();  // Очищаем буфер вывода, чтобы избежать вывода лишней информации.
		cot_sendheaders('text/plain');  // Отправляем заголовок для вывода в формате plain text.
	}
	debug_print_backtrace();  // Функция, которая выводит стек вызовов программы.

	if ($clear_screen)  // Если флаг $clear_screen установлен в TRUE, завершаем выполнение программы.
	{
		die();  // Завершаем выполнение скрипта.
	}
}

Комментарии

  1. function cot_backtrace($clear_screen = TRUE)

    • Функция называется cot_backtrace и принимает один параметр $clear_screen.
    • Параметр $clear_screen по умолчанию установлен в TRUE. Если он равен TRUE, то перед выводом стека вызовов будет очищен экран (выход из всех предыдущих выводов). Если FALSE, стек вызовов будет выведен в обычном потоке.
  2. if ($clear_screen)

    • Проверяется значение параметра $clear_screen. Если оно истинно, то будет выполнен следующий блок кода. Это условие позволяет контролировать, нужно ли очищать экран перед выводом.
  3. ob_end_clean()

    • Эта функция завершает работу с буфером вывода и очищает его. Если до вызова этой функции был записан какой-либо вывод в буфер, он будет удален.
    • Это нужно для того, чтобы предотвратить вывод лишней информации (например, от предыдущих операций или ошибок) до того, как будет напечатан стек вызовов.
  4. cot_sendheaders('text/plain')

    • Эта функция отправляет заголовки, которые указывают браузеру, что ответ должен быть в текстовом формате (text/plain). Это важно, чтобы браузер корректно отобразил вывод в виде простого текста.
  5. debug_print_backtrace()

    • Это стандартная функция PHP, которая выводит стек вызовов. Стек вызовов показывает последовательность всех вызовов функций, начиная с текущей и заканчивая самой первой функцией, которая была вызвана. Она полезна для отладки, так как позволяет увидеть, какие функции и в каком порядке были выполнены.
  6. if ($clear_screen)

    • Еще раз проверяется флаг $clear_screen. Если он равен TRUE, выполнение скрипта завершается.
  7. die()

    • Функция die() завершает выполнение текущего скрипта. В контексте этой функции это нужно, чтобы после вывода стека вызовов выполнение программы было прекращено. Это часто используется в отладке, чтобы увидеть стек вызовов и остановить дальнейшую обработку, избегая лишних действий.

Итог

Функция cot_backtrace предоставляет отладочную информацию о стековом следе выполнения программы. Она может либо очистить экран перед выводом этой информации, либо показать её в обычном потоке. При этом выполнение скрипта останавливается после вывода стека вызовов, что полезно для детальной отладки.

 


/**
 * Печатает структуру и содержимое всех глобальных переменных, которые в данный момент назначены.
 *
 * @param bool $clear_screen Если TRUE, то выводится только var_dump. В противном случае будет выведено в обычном потоке.
 * @see COT_VARDUMP_LOCALS, cot_assert(), cot_backtrace()
 */
function cot_vardump($clear_screen = TRUE)  // Функция cot_vardump принимает один параметр $clear_screen (по умолчанию TRUE). Этот параметр контролирует, будет ли очищен экран перед выводом.
{
    if ($clear_screen)  // Проверка, нужно ли очищать экран перед выводом.
    {
        ob_end_clean();  // Если нужно очищать экран, выполняется очистка буфера вывода с помощью ob_end_clean(). Это удаляет весь вывод, который был произведен до этого момента.
    }

    foreach ($GLOBALS as $key => $val)  // Перебираем все глобальные переменные в массиве $GLOBALS, который содержит все глобальные переменные, доступные в текущем скрипте.
    {
        if ($key != 'GLOBALS')  // Исключаем сам массив $GLOBALS из вывода, так как он уже содержит все глобальные переменные.
        {
            echo "<br /><em>$key</em><br />";  // Выводим имя текущей глобальной переменной ($key) в виде HTML-тега <em> для выделения текста.
            var_dump($val);  // Выводим содержимое текущей переменной ($val) с помощью функции var_dump(). Это выведет тип данных и значение переменной.
        }
    }

    if ($clear_screen)  // Если флаг $clear_screen равен TRUE, то завершение выполнения скрипта.
    {
        die();  // Завершаем выполнение скрипта после вывода отладочной информации, чтобы предотвратить дальнейший вывод.
    }
}

Разбор:

  1. function cot_vardump($clear_screen = TRUE)

    • Функция называется cot_vardump, она принимает один параметр $clear_screen, который по умолчанию установлен в TRUE. Этот параметр контролирует, нужно ли очищать экран перед выводом отладочной информации.
  2. if ($clear_screen)

    • Проверяется, нужно ли очищать экран перед выводом. Если флаг $clear_screen установлен в TRUE, то выполняется очистка буфера вывода.
  3. ob_end_clean()

    • Функция ob_end_clean() очищает буфер вывода. Это необходимо для того, чтобы удалить весь предварительный вывод, который был записан в буфер до вызова этой функции. Таким образом, перед выводом отладочной информации на экране не будет мусора.
  4. foreach ($GLOBALS as $key => $val)

    • В цикле перебираются все глобальные переменные, которые находятся в массиве $GLOBALS. Этот массив включает все глобальные переменные, доступные в текущем контексте. Каждая переменная в нем имеет ключ (имя переменной) $key и значение переменной $val.
  5. if ($key != 'GLOBALS')

    • Проверяется, чтобы исключить сам массив $GLOBALS из вывода. Переменная GLOBALS не имеет смысла для отладки, так как она содержит все глобальные переменные.
  6. echo "<br /><em>$key</em><br />"

    • Выводим имя текущей переменной в виде HTML-кода, используя теги <br /> для переноса строки и <em> для выделения текста. Это поможет визуально разделить вывод информации о разных переменных.
  7. var_dump($val)

    • Функция var_dump() выводит информацию о переменной: ее тип и значение. Это позволяет увидеть полное содержимое переменной, включая все вложенные массивы и объекты, что полезно для отладки.
  8. if ($clear_screen)

    • Если флаг $clear_screen равен TRUE, выполняется завершение работы скрипта.
  9. die()

    • Функция die() завершает выполнение скрипта. Это необходимо для того, чтобы после вывода отладочной информации программа не продолжала свою работу и не выводила лишнюю информацию.

Заключение:

Функция cot_vardump предназначена для вывода всех глобальных переменных, которые доступны в текущем скрипте, с их содержимым и типами данных. Она может очищать экран перед выводом, чтобы исключить лишний вывод, и завершать выполнение программы после вывода, если параметр $clear_screen установлен в TRUE. Это полезный инструмент для отладки и анализа состояния глобальных переменных в коде.


/**
 * Локальная макро-функция vardump. Печатает структуру и содержимое всех переменных в локальной области видимости.
 *
 * @example eval(COT_VARDUMP_LOCALS);
 * @see cot_vardump(), cot_watch()
 */
define('COT_VARDUMP_LOCALS', 'ob_end_clean();  // Очищаем буфер вывода, если он существует, с помощью ob_end_clean().
$debug_vars = get_defined_vars();  // Получаем все определенные переменные в текущей области видимости и сохраняем их в массив $debug_vars.
foreach ($debug_vars as $debug_key => $debug_val)  // Перебираем все переменные, определенные в текущем контексте.
{
    if ($debug_key != "GLOBALS" && $debug_key != "debug_vars")  // Исключаем из вывода переменные GLOBALS и сам массив $debug_vars.
    {
        echo "<br /><em>$debug_key</em><br />";  // Выводим имя текущей переменной в виде HTML-тега <em> для выделения.
        var_dump($debug_val);  // Используем var_dump() для вывода информации о значении текущей переменной (тип и значение).
    }
}
die();  // Завершаем выполнение скрипта, чтобы избежать дальнейшего вывода после отладки.
');

Разбор:

  1. define('COT_VARDUMP_LOCALS', '...')

    • Здесь создается константа COT_VARDUMP_LOCALS, которая содержит строку PHP-кода. Этот код будет выполнен при вызове eval(COT_VARDUMP_LOCALS).
  2. ob_end_clean();

    • Очищает буфер вывода, если он был начат, тем самым устраняя любой предыдущий вывод перед выполнением отладки.
  3. $debug_vars = get_defined_vars();

    • Функция get_defined_vars() возвращает массив всех переменных, определенных в текущей области видимости, включая локальные переменные и глобальные переменные, если они были объявлены в этом контексте.
  4. foreach ($debug_vars as $debug_key => $debug_val)

    • Перебираются все переменные, определенные в текущей области видимости. Для каждой переменной сохраняется ключ (имя переменной) в $debug_key и значение переменной в $debug_val.
  5. if ($debug_key != "GLOBALS" && $debug_key != "debug_vars")

    • Исключаются из вывода переменные GLOBALS (массив, содержащий все глобальные переменные) и сам массив $debug_vars (который содержит все локальные переменные). Эти переменные не должны быть выведены, так как они являются служебными.
  6. echo "<br /><em>$debug_key</em><br />";

    • Имя переменной ($debug_key) выводится на экран с помощью HTML-тега <em>, который выделяет текст.
  7. var_dump($debug_val);

    • Используется функция var_dump(), чтобы вывести тип и содержимое переменной. Это позволяет увидеть полное описание значения переменной, включая тип данных и структуру (если переменная — это массив или объект).
  8. die();

    • Завершается выполнение скрипта с помощью die(), чтобы предотвратить дальнейший вывод после отладки.

Заключение:

Макрос COT_VARDUMP_LOCALS используется для вывода всех локальных переменных, определенных в области видимости, где он вызван. Он очищает экран перед выводом, исключает служебные переменные из вывода и завершает выполнение скрипта после отладки. Этот макрос полезен для детальной диагностики состояния переменных в текущем контексте выполнения программы.

 


/**
 * Записывает текущее состояние глобальных переменных в файл отладки и продолжает обычное выполнение скрипта.
 *
 * @global string $cfg['debug_logpath'] Путь к файлу для записи лога отладки.
 * @see COT_CHECKPOINT_LOCALS, cot_watch(), cot_vardump()
 */
function cot_checkpoint()
{
    global $cfg;  // Используем глобальную переменную $cfg, которая содержит конфигурационные параметры.
    
    // Открываем или создаем файл для записи лога отладки. Путь к файлу определяется в $cfg['debug_logpath'].
    // Имя файла содержит текущую дату и время (в формате ГГГГММДД_ЧЧММСС), чтобы избежать перезаписи логов.
    $fp = fopen($cfg['debug_logpath'] . '/cot_debug_' . date('Ymd_His') . '.log', 'a');
    
    // Получаем стек вызовов (backtrace), который содержит информацию о том, как была вызвана текущая функция.
    $btrace = debug_backtrace();
    
    // Записываем в лог файл имя файла и номер строки, где был вызван cot_checkpoint().
    fputs($fp, $btrace[1]['file'] . ', ' . $btrace[1]['line'] . ":\n");
    
    // Перебираем все глобальные переменные.
    foreach ($GLOBALS as $key => $val)
    {
        // Исключаем из лога переменную 'GLOBALS', чтобы не записывать сам массив глобальных переменных.
        if ($key != 'GLOBALS')
        {
            // Записываем имя переменной и её значение в лог файл. Для массивов и объектов используется print_r().
            fputs($fp, "$key = " . print_r($val, TRUE) . "\n");
        }
    }
    
    // Разделитель для лучшей читаемости логов.
    fputs($fp, "----------------\n");
    
    // Закрываем файл после записи.
    fclose($fp);
}

Разбор:

  1. global $cfg;

    • Эта строка делает переменную $cfg доступной внутри функции. Переменная $cfg обычно содержит глобальные настройки системы, в том числе путь к файлам и другие конфигурационные данные.
  2. $fp = fopen($cfg['debug_logpath'] . '/cot_debug_' . date('Ymd_His') . '.log', 'a');

    • Открывается файл для записи лога. Путь к файлу определяется значением $cfg['debug_logpath'] (предположительно это путь к папке для логов). Имя файла включает текущую дату и время в формате ГГГГММДД_ЧЧММСС, чтобы создавать уникальные имена для каждого лога. Открытие в режиме 'a' означает добавление в конец файла, если он существует.
  3. $btrace = debug_backtrace();

    • Функция debug_backtrace() возвращает стек вызовов — массив, в котором содержится информация о том, как была вызвана текущая функция. Это может помочь в отладке, например, для определения местоположения вызова.
  4. fputs($fp, $btrace[1]['file'] . ', ' . $btrace[1]['line'] . ":\n");

    • Мы записываем в лог файл имя файла и строку, в которой был вызван cot_checkpoint(). $btrace[1] указывает на предыдущий вызов функции, то есть функцию, из которой был вызван cot_checkpoint().
  5. foreach ($GLOBALS as $key => $val)

    • Перебираем все глобальные переменные, используя массив $GLOBALS. Это позволит нам вывести все переменные, доступные в глобальной области видимости.
  6. if ($key != 'GLOBALS')

    • Мы исключаем переменную GLOBALS, потому что она сама является массивом всех глобальных переменных, и её вывод не имеет смысла в логе.
  7. fputs($fp, "$key = " . print_r($val, TRUE) . "\n");

    • Для каждой переменной записываем её имя и значение в лог файл. Используется print_r(), так как эта функция удобно выводит массивы и объекты в читабельном виде. Второй параметр TRUE позволяет вернуть результат в виде строки, а не вывести его напрямую.
  8. fputs($fp, "----------------\n");

    • Добавляется разделитель, чтобы отделить записи от разных вызовов в логе, улучшая читаемость.
  9. fclose($fp);

    • Закрываем файл после записи, освобождая ресурсы.

Заключение:

Функция cot_checkpoint() используется для записи текущего состояния глобальных переменных в лог-файл. Она сохраняет информацию о месте вызова функции, а также о всех глобальных переменных, что может быть полезно для отладки. Лог-файл сохраняется с уникальным именем, основанным на текущей дате и времени.

 


/**
 * Записывает переменные в локальной области видимости в файл отладки и продолжает обычное выполнение скрипта.
 *
 * @global string $cfg['debug_logpath'] Путь к файлу для записи лога отладки.
 * @example eval(COT_CHECKPOINT_LOCALS); Пример использования.
 * @see cot_checkpoint(), cot_watch(), COT_VARDUMP_LOCALS
 */
define('COT_CHECKPOINT_LOCALS', 'global $cfg;  // Используем глобальную переменную $cfg для доступа к конфигурации.
	$debug_fp = fopen($cfg[\'debug_logpath\'] . \'/cot_debug_\' . date(\'Ymd_His\') . \'.log\', "a");  // Открываем или создаем файл для записи лога. Путь берется из конфигурации ($cfg['debug_logpath']), имя файла включает текущую дату и время (ГГГГММДД_ЧЧММСС) для уникальности.
	$debug_btrace = debug_backtrace();  // Получаем стек вызовов функции для записи информации о том, откуда был вызван этот код.
	fputs($debug_fp, $debug_btrace[0]["file"] . ", " . $debug_btrace[1]["line"] . ":\n");  // Записываем в файл имя файла и строку, откуда был вызван код (предположительно, из предыдущей строки стека вызова).
	$debug_vars = get_defined_vars();  // Получаем все переменные, определенные в текущей области видимости (локальные переменные).
	foreach ($debug_vars as $debug_key => $debug_val)  // Перебираем все локальные переменные.
	{
		if ($debug_key != "GLOBALS" && $debug_key != "debug_vars" && $debug_key != "debug_btrace" && $debug_key != "debug_fp")  // Исключаем из лога переменные, которые не интересуют: 'GLOBALS' (массив всех глобальных переменных), 'debug_vars', 'debug_btrace' и 'debug_fp' (вспомогательные переменные).
		{
			fputs($debug_fp, "$debug_key = " . print_r($debug_val, TRUE) . "\n");  // Записываем в лог имя переменной и её значение. Для массивов и объектов используется print_r().
		}
	}
	fputs($debug_fp, "----------------\n");  // Добавляем разделитель для улучшения читаемости лога.
	fclose($debug_fp);  // Закрываем файл после записи.
');

Разбор:

  1. global $cfg;

    • Эта строка позволяет использовать глобальную переменную $cfg, которая обычно содержит конфигурационные данные, например, путь для записи логов.
  2. $debug_fp = fopen($cfg['debug_logpath'] . '/cot_debug_' . date('Ymd_His') . '.log', "a");

    • Открытие файла для записи лога. Путь берется из $cfg['debug_logpath']. Имя файла включает текущую дату и время (формат ГГГГММДД_ЧЧММСС), чтобы создать уникальное имя для каждого файла лога. Режим 'a' означает добавление данных в конец файла.
  3. $debug_btrace = debug_backtrace();

    • Получаем стек вызовов (backtrace). Это позволяет получить информацию о файле и строке, где был вызван код, что полезно для отладки.
  4. fputs($debug_fp, $debug_btrace[0]["file"] . ", " . $debug_btrace[1]["line"] . ":\n");

    • Записываем в лог имя файла и строку, откуда был вызван этот код. $debug_btrace[0] и $debug_btrace[1] содержат информацию о вызовах из стека.
  5. $debug_vars = get_defined_vars();

    • Получаем все переменные, которые определены в текущей области видимости (локальные переменные).
  6. foreach ($debug_vars as $debug_key => $debug_val)

    • Перебираем все локальные переменные.
  7. if ($debug_key != "GLOBALS" && $debug_key != "debug_vars" && $debug_key != "debug_btrace" && $debug_key != "debug_fp")

    • Исключаем переменные, которые не интересуют нас в логе: GLOBALS (массив всех глобальных переменных), а также вспомогательные переменные (debug_vars, debug_btrace, debug_fp), которые используются в процессе записи лога.
  8. fputs($debug_fp, "$debug_key = " . print_r($debug_val, TRUE) . "\n");

    • Записываем имя переменной и её значение в лог. Для массивов или объектов используется print_r(), который выводит данные в удобочитаемом виде.
  9. fputs($debug_fp, "----------------\n");

    • Добавляем разделитель в лог для отделения разных записей, улучшая читаемость.
  10. fclose($debug_fp);

    • Закрываем файл лога, чтобы сохранить все данные и освободить ресурсы.

Заключение:

Этот фрагмент кода позволяет записывать в лог файл все локальные переменные, которые определены в момент вызова кода. Лог-файл получает уникальное имя, которое включает дату и время. Функция полезна для отладки, так как позволяет отслеживать текущее состояние всех локальных переменных и анализировать их в любой момент времени.

 

 

 

 

 

 

 

 

 

 

 

 

 

19 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 26.01.2025 13:21
  • Последнее обновление: 26.01.2025 13:26