
Кэширование
mFilter использует многоуровневую систему кэширования для оптимизации производительности.
Типы кэша
1. Кэш фильтров (БД)
Хранится в таблице mfl_cache. Кэшируются:
- suggestions — доступные значения фильтров с количеством
- filter_values — значения для построения формы
Формат ключа:
suggestions_{resourceId}_{filterHash}
filter_values_{resourceId}_{depth}2. Кэш роутера (файл)
Хранится в core/cache/mfilter/filter_pages.cache.php.
Содержит маппинг URI → ID ресурса для быстрого определения страниц фильтрации.
<?php
// mFilter filter pages cache
return [
'catalog/' => 5,
'catalog/phones/' => 12,
'catalog/tablets/' => 15,
];3. Кэш слагов (память)
Хранится в памяти во время выполнения запроса:
slugCache— value → slugvalueCache— slug → value
Предзагружается при парсинге URL для минимизации запросов к БД.
Системные настройки
| Настройка | Описание | По умолчанию |
|---|---|---|
mfilter.cache_enabled | Включить кэширование | true |
mfilter.cache_lifetime | Время жизни кэша фильтров (сек) | 3600 |
mfilter.cache_router_lifetime | Время жизни кэша роутера (сек) | 86400 |
Очистка кэша
Из админки
Обслуживание → Очистить кэш
Очищает:
- Все записи из таблицы
mfl_cache - Файл
filter_pages.cache.php
Программно
$mfilter = $modx->services->get('mfilter');
// Очистить весь кэш
$mfilter->clearCache();
// Очистить кэш конкретной страницы
$mfilter->invalidatePageCache($resourceId);
// Перестроить кэш роутера
$mfilter->rebuildRouterCache();Через Filter сервис
$filter = $mfilter->getFilter();
// Очистить кэш для ресурса
$filter->clearCache($resourceId);
// Очистить весь кэш фильтров
$filter->clearCache(0);Автоматическая инвалидация
Кэш автоматически очищается при:
| Событие | Что очищается |
|---|---|
| Сохранение набора фильтров | Кэш страниц набора |
| Удаление набора фильтров | Кэш всех страниц |
| Изменение привязок набора | Кэш роутера |
Ручная инвалидация при изменении товаров
При массовом обновлении товаров рекомендуется очистить кэш:
// После импорта товаров
$mfilter = $modx->services->get('mfilter');
$mfilter->clearCache();Scheduler (фоновые задачи)
При установленном Scheduler доступна задача перестройки кэша.
Запуск задачи
$mfilter = $modx->services->get('mfilter');
$taskId = $mfilter->scheduleCacheRebuild();Параметры задачи
| Параметр | Описание | По умолчанию |
|---|---|---|
clear_first | Очистить кэш перед перестройкой | true |
rebuild_router | Перестроить кэш роутера | true |
rebuild_filters | Перестроить кэш фильтров | true |
Отключение кэша
Глобально
Системные настройки → mfilter.cache_enabled → НетДля отладки
При включённом профайлере (mfilter.debug_profiler) в логах видно:
suggestions.cacheHit— попадание в кэшsuggestions.cacheCheck— время проверки кэша
Размер кэша
Проверка в админке
mFilter → Обслуживание → Статус системы
Показывает:
- Количество записей в кэше
- Количество файлов кэша
Программно
// Количество записей в БД
$count = $modx->getCount('MFilter\\Model\\MflCache');
// Файлы кэша
$cachePath = MODX_CORE_PATH . 'cache/mfilter/';
$files = glob($cachePath . '*');Рекомендации
Для небольших каталогов (до 1000 товаров)
- Используйте настройки по умолчанию
- Кэш обновится автоматически при истечении TTL
Для средних каталогов (1000-10000 товаров)
- Увеличьте
cache_lifetimeдо 7200-14400 - Настройте очистку кэша после импорта
Для больших каталогов (10000+ товаров)
- Используйте Scheduler для фоновой перестройки
- Настройте cron-задачу на ночное время:
// Задача Scheduler
$mfilter->scheduleCacheRebuild();При частых обновлениях товаров
Если товары обновляются часто (цены, наличие), уменьшите TTL:
mfilter.cache_lifetime = 1800При редких обновлениях
Увеличьте TTL для максимальной производительности:
mfilter.cache_lifetime = 86400
mfilter.cache_router_lifetime = 604800Структура таблицы mfl_cache
| Поле | Тип | Описание |
|---|---|---|
id | int | Первичный ключ |
cache_key | varchar(255) | Уникальный ключ кэша |
cache_value | mediumtext | Сериализованные данные (JSON) |
created_at | datetime | Время создания |
expires_at | datetime | Время истечения |
Индексы:
uk_cache_key— уникальный индекс по ключуidx_expires— индекс для очистки устаревших записей
