Файл admin.cache.disk.php в Cotonti CMF

Файл admin.cache.disk.php в движке Cotonti CMF является частью административной панели, предназначенной для управления кешем на диске. Он предоставляет интерфейс для очистки и управления кешем, который используется для улучшения производительности системы за счет хранения временных данных. Основная цель этого файла — обеспечить инструменты для администраторов для контроля за состоянием кеша, включая его очистку и удаление, как для отдельных элементов, так и для всего кеша.

Основные задачи и условия, выполняемые в файле:

  1. Очистка кеша:

    • Очистка всего кеша или отдельных его элементов с возможностью удаления поддиректорий.
    • При удалении кеша также очищаются определенные системные данные, например, кеш HTML-консолидации ресурсов.
    • Возможность очистки кеша через административную панель с дополнительными проверками безопасности (например, проверка XSRF).
  2. Управление кешем:

    • Администраторы могут просматривать информацию о кешированных файлах и директориях, их размере и количестве.
    • Можно удалять конкретные файлы кеша через интерфейс.
  3. Реализация через хуки:

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

Место в системе:

Файл является частью административной панели Cotonti. Он работает с кешем системы, что является важной частью архитектуры фреймворка для повышения производительности и эффективного использования ресурсов сервера. Управление кешем позволяет уменьшить нагрузку на сервер и ускорить работу системы, что особенно важно при большом объеме данных.

Методы и функции в файле:

  1. cot_diskcache_clear($dir, $do_subdirs = true, $rm_dir = false):

    • Очищает кеш в указанной директории. Также имеет возможность рекурсивно очищать поддиректории и удалять саму директорию.
  2. cot_diskcache_clearall():

    • Полностью очищает все кешированные данные в системе, включая все поддиректории кеша.
  3. cot_diskcache_calc($dir, $do_subdirs = true):

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

    • Возвращает список всех ненулевых поддиректорий в каталоге кеша, включая файлы.
  5. cot_diskcache_clear($dir, $do_subdirs = true, $rm_dir = false):

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

Стиль PHP:

  • Простой и линейный стиль: Код написан в классическом процедурном стиле с использованием глобальных переменных, таких как $cfg и Cot::$cfg. Это характерно для старых версий Cotonti, но все еще актуально для фреймворка в целом.
  • Использование хуков: В файле есть механизмы для подключения внешних плагинов через хуки (cot_getextplugins()), что позволяет модифицировать и расширять функциональность без изменения исходного кода.
  • Безопасность: В коде присутствуют проверки безопасности, например, проверка XSRF (cot_check_xg()), что является важным элементом для предотвращения атак.

Заключение:

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

 

<?php
/**
 * Administration panel - Disk cache
 *
 * Панель администрирования - Управление дисковым кэшем
 *
 * @package Cotonti
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */

(defined('COT_CODE') && defined('COT_ADMIN')) or die('Wrong URL.');
// Проверка на наличие необходимых констант 'COT_CODE' и 'COT_ADMIN'.
// Если они не определены, выводит сообщение "Wrong URL" и завершает выполнение.

define('COT_DISKCACHE_ONLYFILES', '*files*');
// Определение константы 'COT_DISKCACHE_ONLYFILES' со значением '*files*'.
// Эта константа может использоваться для работы с определённым типом данных в кэше.

list($usr['auth_read'], $usr['auth_write'], $usr['isadmin']) = cot_auth('admin', 'a');
// Установка прав доступа текущего пользователя для модуля 'admin' и области 'a'.
// Устанавливаются флаги на чтение, запись и административный доступ.

cot_block($usr['isadmin']);
// Блокирует доступ к данному файлу, если пользователь не является администратором.

$t = new XTemplate(cot_tplfile('admin.cache.disk', 'core'));
// Создание нового объекта XTemplate с использованием шаблона 'admin.cache.disk' из ядра системы.

$adminPath[] = array(cot_url('admin', 'm=other'), $L['Other']);
// Добавление ссылки в массив пути навигации административной панели, указывающей на раздел "Прочее".

$adminPath[] = array(cot_url('admin', 'm=cache&s=disk'), $L['adm_diskcache']);
// Добавление ссылки в массив пути навигации административной панели, указывающей на управление дисковым кэшем.

$adminTitle = $L['adm_diskcache'];
// Установка заголовка страницы административной панели на 'adm_diskcache' (значение из языкового файла).

/* === Hook === */
foreach (cot_getextplugins('admin.cache.disk.first') as $pl)
{
	include $pl;
}
// Выполнение плагинов, привязанных к хуку 'admin.cache.disk.first'.
// Эти плагины могут изменять или расширять поведение текущего кода.
/* ===== */

 

if ($a === 'purge') { 
    // Проверяем, является ли действие 'purge' (очистка всего кэша).
    
    if (cot_check_xg() && cot_diskcache_clearall()) { 
        // Проверяем защитный токен (XSS Guard) и очищаем весь дисковый кэш.
        
        cot_message('adm_purgeall_done'); 
        // Выводим сообщение о том, что кэш успешно очищен.
        
        // Очищаем кэш для объединённых ресурсов (CSS/JS).
        Cot::$db->delete(Cot::$db->cache, "c_name = 'cot_rc_html'"); 
    } else { 
        cot_message('Error'); 
        // Если очистка не удалась, выводим сообщение об ошибке.
    }

    cot_redirect(cot_url('admin', ['m' => 'cache', 's' => 'disk'], '', true)); 
    // Перенаправляем пользователя обратно на страницу управления дисковым кэшем.

} elseif ($a == 'delete') { 
    // Проверяем, является ли действие 'delete' (удаление конкретного элемента кэша).

    $is_id = mb_strpos($id, '/') === false && mb_strpos($id, '\\') === false && $id != '.' && $id != '..'; 
    // Проверяем, что идентификатор (имя элемента кэша) не содержит запрещённых символов ("/", "\", ".", "..").
    
    $is_onlyf = $id == COT_DISKCACHE_ONLYFILES; 
    // Проверяем, является ли идентификатор константой COT_DISKCACHE_ONLYFILES (*files*).

    if (
        cot_check_xg() // Проверяем защитный токен (XSS Guard).
        && $is_id // Убедимся, что идентификатор прошёл проверку.
        && cot_diskcache_clear(\Cot::$cfg['cache_dir'] . ($is_onlyf ? '' : "/$id"), !$is_onlyf) 
        // Вызываем функцию для очистки кэша: либо всего каталога, либо конкретного элемента.
    ) {
        cot_message('adm_delcacheitem'); 
        // Выводим сообщение об успешном удалении элемента кэша.

        if ($id == 'static' || $is_onlyf) { 
            // Если удаляется статический кэш или только файлы...

            // Очищаем кэш объединённых ресурсов (CSS/JS).
            \Cot::$db->delete(\Cot::$db->cache, "c_name = 'cot_rc_html'"); 
        }
    } else { 
        cot_message('Error'); 
        // Если удаление не удалось, выводим сообщение об ошибке.
    }

    cot_redirect(cot_url('admin', ['m' => 'cache', 's' => 'disk'], '', true)); 
    // Перенаправляем пользователя обратно на страницу управления дисковым кэшем.
}

Объяснение кода:

  1. Очистка всего кэша (purge):

    • Проверяется, что запрос прошёл проверку токена (предотвращение XSS-атак).
    • Очищается весь дисковый кэш.
    • Дополнительно очищается кэш для объединённых ресурсов.
  2. Удаление конкретного элемента кэша (delete):

    • Проверяется, что идентификатор корректен и не содержит запрещённых символов.
    • Если удаление успешно, выводится сообщение и очищается соответствующий кэш для объединённых ресурсов, если это необходимо.

 

$row = cot_diskcache_list(); 
// Получаем список всех файлов и папок в дисковом кэше с их данными (количество файлов и общий размер).

$cachefiles = $cachesize = 0; 
// Инициализируем переменные для подсчёта общего количества файлов и их общего размера.

$ii = 0; 
// Счётчик для отслеживания порядкового номера элемента.


// === Hook - Part1 : Set ===
$extp = cot_getextplugins('admin.cache.disk.loop'); 
// Загружаем плагины, подключённые к хуку 'admin.cache.disk.loop'.
// =====

foreach ($row as $i => $x) 
// Перебираем каждый элемент из списка файлов кэша.
{
    $cachefiles += $x[0]; 
    // Увеличиваем общее количество файлов на значение текущего элемента.

    $cachesize += $x[1]; 
    // Увеличиваем общий размер файлов на значение текущего элемента.

    $t->assign(array( 
        // Передаём данные в шаблон для отображения строки с информацией о конкретном элементе кэша.
        'ADMIN_DISKCACHE_ITEM_DEL_URL' => cot_url('admin', 'm=cache&s=disk&a=delete&id=' . $i . '&' . cot_xg()), 
        // URL для удаления данного элемента кэша (с токеном защиты).
        
        'ADMIN_DISKCACHE_ITEM_NAME' => $i, 
        // Имя элемента кэша (папка или файл).

        'ADMIN_DISKCACHE_FILES' => $x[0], 
        // Количество файлов в данном элементе.

        'ADMIN_DISKCACHE_SIZE' => $x[1], 
        // Размер файлов в данном элементе.

        'ADMIN_DISKCACHE_ROW_ODDEVEN' => cot_build_oddeven($ii) 
        // Генерируем класс "odd" или "even" для CSS-стилей строки таблицы.
    ));

    // === Hook - Part2 : Include ===
    foreach ($extp as $pl) 
    {
        include $pl; 
        // Выполняем плагины, подключённые к хуку 'admin.cache.disk.loop'.
    }
    // =====

    $t->parse('MAIN.ADMIN_DISKCACHE_ROW'); 
    // Парсим строку для таблицы с элементами дискового кэша.

    $ii++; 
    // Увеличиваем счётчик строк.
}

$t->assign(array( 
    // Передаём данные в шаблон для итоговой информации.
    'ADMIN_DISKCACHE_URL_REFRESH' => cot_url('admin', 'm=cache&s=disk'), 
    // URL для обновления страницы управления дисковым кэшем.

    'ADMIN_DISKCACHE_URL_PURGE' => cot_url('admin', 'm=cache&s=disk&a=purge&' . cot_xg()), 
    // URL для очистки всего кэша (с токеном защиты).

    'ADMIN_DISKCACHE_CACHEFILES' => $cachefiles, 
    // Общее количество файлов в кэше.

    'ADMIN_DISKCACHE_CACHESIZE' => $cachesize 
    // Общий размер файлов в кэше.
));

cot_display_messages($t); 
// Отображаем сообщения (например, об успешном удалении кэша).

// === Hook ===
foreach (cot_getextplugins('admin.cache.disk.tags') as $pl) 
{
    include $pl; 
    // Выполняем плагины, подключённые к хуку 'admin.cache.disk.tags'.
}
// =====

$t->parse('MAIN'); 
// Парсим основной блок шаблона.

$adminMain = $t->text('MAIN'); 
// Генерируем HTML-вывод страницы.
  • Сбор данных о кэше:

    • Получаем список файлов и папок из дискового кэша.
    • Считаем общее количество файлов и их общий размер.
  • Формирование таблицы:

    • Для каждого элемента кэша генерируется строка таблицы, включающая:
      • Имя элемента.
      • Количество файлов.
      • Размер.
      • Ссылка для удаления элемента.
  • Подключение плагинов:

    • Хуки (admin.cache.disk.loop и admin.cache.disk.tags) позволяют расширить функционал через плагины.
  • Управление действиями:

    • Генерируются ссылки для обновления страницы и очистки всего кэша.
  • Вывод страницы:

    • Подготовленные данные передаются в шаблон, генерируется HTML-страница для панели администратора.

 

/**
 * Calculates directory size
 * It's helper function for cot_diskcache_list()
 * 
 * Функция вычисляет размер директории и количество файлов. 
 * Это вспомогательная функция для cot_diskcache_list().
 *
 * @param string $dir Directory name
 * @param bool $do_subdirs true when enter subdirectories, otherwise false
 *                         Если true, то функция рекурсивно заходит в поддиректории.
 * @return array Возвращает массив с количеством файлов/папок и общим размером в байтах.
 */
function cot_diskcache_calc($dir, $do_subdirs = true)
{
	$count = $size = 0; 
	// Инициализация счётчика файлов и общего размера.

	$glob = glob("$dir/*"); 
	// Получаем список всех файлов и папок в указанной директории.

	if (is_array($glob)) { 
		// Проверяем, удалось ли получить массив результатов.
		foreach ($glob as $f) { 
			// Перебираем все элементы директории.
			if (
                is_file($f) 
                // Проверяем, является ли текущий элемент файлом.

                && !in_array($f, [\Cot::$cfg['cache_dir'] . '/index.html', \Cot::$cfg['cache_dir'] . '/.htaccess']) 
                // Исключаем из расчёта файлы index.html и .htaccess.
            ) {
				$count++; 
				// Увеличиваем счётчик файлов.

				$size += @filesize($f); 
				// Добавляем размер текущего файла к общему размеру.
			} elseif (is_dir($f) && $do_subdirs) { 
				// Если элемент — это директория и разрешён переход в поддиректории.
				$a = cot_diskcache_calc($f); 
				// Рекурсивно вызываем функцию для подсчёта файлов и их размера в поддиректории.

				$count += $a[0]/*files*/ + 1/*directory*/; 
				// Увеличиваем общее количество: файлы в поддиректории + сама папка.

				$size += $a[1]; 
				// Увеличиваем общий размер: добавляем размер файлов из поддиректории.
			}
		}
	}

	return [$count, $size]; 
	// Возвращаем массив с общим количеством файлов/папок и их размером.
}

Объяснение кода:

  1. Задача функции:

    • Вычислить общее количество файлов (включая поддиректории, если разрешено) и общий размер всех файлов в указанной директории.
  2. Обработка элементов директории:

    • Если элемент — файл, добавляется его размер и он учитывается в общем количестве.
    • Если элемент — папка, функция вызывается рекурсивно для этой поддиректории (если разрешено do_subdirs).
  3. Исключения:

    • Файлы index.html и .htaccess из корневого каталога кэша исключены из подсчёта, чтобы они не влияли на данные.
  4. Результат:

    • Функция возвращает массив:
      • Первый элемент — общее количество файлов и папок.
      • Второй элемент — общий размер всех файлов в байтах.

 

/**
 * Returns list of non-empty subdirectories in disk cache directory
 * Возвращает список непустых поддиректорий в каталоге кэша на диске.
 *
 * @global $cfg Глобальный массив конфигурации.
 * @return array Ассоциативный массив, где ключи — названия поддиректорий,
 *               а значения — массивы с количеством файлов и их общим размером.
 */
function cot_diskcache_list()
{
	global $cfg; 
	// Используем глобальный массив конфигурации.

	$dir_a = array(); 
	// Инициализируем массив для хранения информации о поддиректориях.

	$a = cot_diskcache_calc($cfg['cache_dir'], false); 
	// Подсчитываем количество файлов и их размер в корневой директории кэша, без поддиректорий.

	if ($a[0]) 
	// Если в корневой директории есть файлы:
	{
		$dir_a[COT_DISKCACHE_ONLYFILES] = $a; 
		// Добавляем информацию о корневой директории кэша в массив результатов.
	}

	$pos = mb_strlen($cfg['cache_dir']) + 1; 
	// Определяем длину пути до корневой директории кэша, чтобы затем обрезать этот путь.

	$glob = glob("{$cfg['cache_dir']}/*", GLOB_ONLYDIR); 
	// Получаем список всех поддиректорий в корневом каталоге кэша.

	if (is_array($glob)) 
	// Проверяем, является ли результат массивом.
	{
		foreach ($glob as $dir) 
		// Перебираем каждую поддиректорию:
		{
			$a = cot_diskcache_calc($dir); 
			// Подсчитываем количество файлов и их размер в текущей поддиректории (с учётом поддиректорий).

			if ($a[0]) 
			// Если в поддиректории есть файлы:
			{
				$dir_a[mb_substr($dir, $pos)] = $a; 
				// Добавляем информацию о поддиректории в массив результатов,
				// используя относительный путь (убираем корневую директорию кэша).
			}
		}
	}

	return $dir_a; 
	// Возвращаем массив с информацией о всех поддиректориях и файлах в кэше.
}

 

/**
 * Очищает директорию с кешем на диске. Даже если кеш выключен
 *
 * @param string $dir Имя директории
 * @param bool $do_subdirs true, если нужно зайти в поддиректории, иначе false
 * @param bool $rm_dir true, если нужно удалить директорию, иначе false
 * @return bool
 */
function cot_diskcache_clear($dir, $do_subdirs = true, $rm_dir = false)  // Определяется функция для очистки кеша, принимает параметры: директория, флаг для поддиректорий, флаг для удаления самой директории
{
	if (!is_dir($dir) || !is_writable($dir)) {  // Проверка, существует ли директория и доступна ли она для записи
		return false;  // Если директория не существует или не доступна для записи, возвращаем false
	}

	$glob = glob("$dir/*");  // Получаем все файлы и директории в указанной директории
	if (is_array($glob)) {  // Если результат glob() является массивом (то есть найдены файлы и папки)
		foreach ($glob as $f) {  // Перебираем каждый элемент в массиве
			if (  // Если элемент является файлом и не является исключениями (index.html и .htaccess)
                is_file($f)
                && !in_array($f, [Cot::$cfg['cache_dir'] . '/index.html', Cot::$cfg['cache_dir'] . '/.htaccess'])
            ) {
				@unlink($f);  // Удаляем файл
			} elseif (is_dir($f) && $do_subdirs) {  // Если элемент является директорией и флаг для поддиректорий установлен в true
				cot_diskcache_clear($f, true, true);  // Рекурсивно очищаем поддиректорию
			}
		}
	}

	if ($rm_dir) {  // Если флаг для удаления директории установлен в true
		@rmdir($dir);  // Удаляем саму директорию
	}

	return true;  // Возвращаем true, если все прошло успешно
}

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

 

/**
 * Полностью очищает кеш на диске. Даже если кеш выключен
 * @global $cfg
 * @return bool
 */
function cot_diskcache_clearall()  // Определяется функция для полной очистки кеша
{
	cot_diskcache_clear(Cot::$cfg['cache_dir'], false);  // Очищаем основную директорию кеша без захода в поддиректории
	$glob = glob(Cot::$cfg['cache_dir'] . '/*', GLOB_ONLYDIR);  // Получаем все поддиректории в директории кеша
	if (is_array($glob)) {  // Если найден хотя бы один каталог в указанной директории
		foreach ($glob as $dir) {  // Перебираем каждую поддиректорию
			cot_diskcache_clear($dir, true, true);  // Рекурсивно очищаем поддиректорию и удаляем ее
		}
	}

	return true;  // Возвращаем true, что очистка прошла успешно
}

Этот участок кода выполняет полную очистку кеша на диске, включая очистку всех поддиректорий в основной директории кеша. Даже если кеш отключен, он удаляет все файлы и директории кеша.

 

 

 

 

 

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

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

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

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

Administrator

Оффлайн

Administrator

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

  • Страница размещена: 28.01.2025 15:30
  • Последнее обновление: 28.01.2025 15:30

Похожие страницы

Файл admin.cache.php в Cotonti
1 Основное назначение файла: Файл admin.cache.php в движке Cotonti CMF предназначен для управления внутренним кешем
Файл cache.php в Cotonti
2 Основное назначение файла cache.php в системной папке Cotonti CMF: Файл cache.php в Cotonti CMF (Content Management
Файл admin.config.php в Cotonti CMF
3 Основное назначение файла и его место в системе Файл admin.config.php является частью административной панели системы
Файл admin.extensions.php в Cotonti CMF
4 Файл "admin.extensions.php" в движке Cotonti CMF является важным компонентом административной части системы,
Файл admin.extrafields.php в Cotonti CMF
5 Файл admin.extrafields.php в движке Cotonti CMF предназначен для управления дополнительными полями (extra fields) в