Файл admin.cache.disk.php в Cotonti CMF
Файл admin.cache.disk.php в движке Cotonti CMF является частью административной панели, предназначенной для управления кешем на диске. Он предоставляет интерфейс для очистки и управления кешем, который используется для улучшения производительности системы за счет хранения временных данных. Основная цель этого файла — обеспечить инструменты для администраторов для контроля за состоянием кеша, включая его очистку и удаление, как для отдельных элементов, так и для всего кеша.
Основные задачи и условия, выполняемые в файле:
-
Очистка кеша:
- Очистка всего кеша или отдельных его элементов с возможностью удаления поддиректорий.
- При удалении кеша также очищаются определенные системные данные, например, кеш HTML-консолидации ресурсов.
- Возможность очистки кеша через административную панель с дополнительными проверками безопасности (например, проверка XSRF).
-
Управление кешем:
- Администраторы могут просматривать информацию о кешированных файлах и директориях, их размере и количестве.
- Можно удалять конкретные файлы кеша через интерфейс.
-
Реализация через хуки:
- В коде используются хуки, что позволяет подключать дополнительные расширения или модули для взаимодействия с системой кеша. Это дает гибкость в расширении функционала.
Место в системе:
Файл является частью административной панели Cotonti. Он работает с кешем системы, что является важной частью архитектуры фреймворка для повышения производительности и эффективного использования ресурсов сервера. Управление кешем позволяет уменьшить нагрузку на сервер и ускорить работу системы, что особенно важно при большом объеме данных.
Методы и функции в файле:
-
cot_diskcache_clear($dir, $do_subdirs = true, $rm_dir = false):- Очищает кеш в указанной директории. Также имеет возможность рекурсивно очищать поддиректории и удалять саму директорию.
-
cot_diskcache_clearall():- Полностью очищает все кешированные данные в системе, включая все поддиректории кеша.
-
cot_diskcache_calc($dir, $do_subdirs = true):- Вспомогательная функция, которая вычисляет количество файлов и общий размер файлов в указанной директории, с возможностью учитывать поддиректории.
-
cot_diskcache_list():- Возвращает список всех ненулевых поддиректорий в каталоге кеша, включая файлы.
-
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));
// Перенаправляем пользователя обратно на страницу управления дисковым кэшем.
}
Объяснение кода:
-
Очистка всего кэша (
purge):- Проверяется, что запрос прошёл проверку токена (предотвращение XSS-атак).
- Очищается весь дисковый кэш.
- Дополнительно очищается кэш для объединённых ресурсов.
-
Удаление конкретного элемента кэша (
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];
// Возвращаем массив с общим количеством файлов/папок и их размером.
}
Объяснение кода:
-
Задача функции:
- Вычислить общее количество файлов (включая поддиректории, если разрешено) и общий размер всех файлов в указанной директории.
-
Обработка элементов директории:
- Если элемент — файл, добавляется его размер и он учитывается в общем количестве.
- Если элемент — папка, функция вызывается рекурсивно для этой поддиректории (если разрешено
do_subdirs).
-
Исключения:
- Файлы
index.htmlи.htaccessиз корневого каталога кэша исключены из подсчёта, чтобы они не влияли на данные.
- Файлы
-
Результат:
- Функция возвращает массив:
- Первый элемент — общее количество файлов и папок.
- Второй элемент — общий размер всех файлов в байтах.
- Функция возвращает массив:
/**
* 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, что очистка прошла успешно
}
Этот участок кода выполняет полную очистку кеша на диске, включая очистку всех поддиректорий в основной директории кеша. Даже если кеш отключен, он удаляет все файлы и директории кеша.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 28.01.2025 15:30
- Последнее обновление: 28.01.2025 15:30