
Кэширование
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 для минимизации запросов к БД.
4. Кэш прогрева (БД)
Хранится в таблице mfl_cache. Создаётся системой прогрева (warmup) заранее, до первого посещения пользователем.
Кэшируются три типа данных:
- baseIds — список ID товаров категории (результат
ElementRunner::getIds()) - filter values — значения для построения формы фильтров
- suggestions — фасетные счётчики (количество товаров для каждого значения)
Формат ключей:
baseids_{resourceId}_{cacheKeyHash}
filters_{resourceId}_{depth}
suggestions_forids_{resourceId}_{filterHash}Конфигурации прогрева хранятся в таблицах mfl_warmup_configs и mfl_warmup_config_resources.
Подробнее: Прогрев кэша
Системные настройки
| Настройка | Описание | По умолчанию |
|---|---|---|
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);Автоматическая инвалидация
Кэш автоматически очищается при:
| Событие | Что очищается |
|---|---|
| Сохранение набора фильтров | Кэш страниц набора |
| Удаление набора фильтров | Кэш всех страниц |
| Изменение привязок набора | Кэш роутера |
Ручная инвалидация при изменении товаров
При массовом обновлении товаров кэш обновится автоматически рекуррентным таском mfl_warmup.
Для немедленного обновления:
$mfilter = $modx->services->get('mfilter');
// Очистить кэш
$mfilter->clearCache();
// Запустить прогрев (если Scheduler установлен)
$mfilter->getWarmupManager()->schedule(true);Scheduler (фоновые задачи)
При установленном Scheduler доступны две задачи:
mfl_rebuild_cache — перестройка кэша
Очищает и заново строит кэш роутера и фильтров.
$mfilter = $modx->services->get('mfilter');
$taskId = $mfilter->scheduleCacheRebuild();| Параметр | Описание | По умолчанию |
|---|---|---|
clear_first | Очистить кэш перед перестройкой | true |
rebuild_router | Перестроить кэш роутера | true |
rebuild_filters | Перестроить кэш фильтров | true |
mfl_warmup — прогрев кэша
Прогревает baseIds, значения фильтров и фасетные счётчики для всех активных конфигураций. Рекуррентный — запускается каждые 50 минут по умолчанию.
$warmupManager = $mfilter->getWarmupManager();
$runId = $warmupManager->schedule(true); // true = с прогревом счётчиков| Параметр | Описание | По умолчанию |
|---|---|---|
warm_suggestions | Прогревать фасетные счётчики и значения фильтров | 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+ товаров)
- Настройте прогрев кэша — создайте конфигурацию и привяжите страницы каталога
- Рекуррентный таск
mfl_warmupбудет обновлять кэш автоматически - Подберите интервал прогрева и TTL под объём каталога и частоту обновлений
# Пример для каталога 200k товаров (прогрев ~30 мин)
mfilter.cache_lifetime = 7200 # TTL 2 часа
# interval таска = 6000 # прогрев каждые 100 минПри частых обновлениях товаров
Рекуррентный прогрев автоматически обновит кэш. Максимальная задержка = интервал прогрева.
Для немедленного обновления после импорта — запустите mfl_warmup вручную из админки.
При редких обновлениях
Увеличьте TTL и интервал прогрева:
mfilter.cache_lifetime = 86400
# interval таска = 43200 # прогрев 2 раза в суткиСтруктура таблицы mfl_cache
| Поле | Тип | Описание |
|---|---|---|
id | int | Первичный ключ |
cache_key | varchar(255) | Уникальный ключ кэша |
cache_value | mediumtext | Сериализованные данные (JSON) |
created_at | datetime | Время создания |
expires_at | datetime | Время истечения |
Индексы:
uk_cache_key— уникальный индекс по ключуidx_expires— индекс для очистки устаревших записей
