
Кэширование
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 | Время жизни записей в mfl_cache (сек) | 3600 |
Подсказка
Кэш роутера живёт в файле core/cache/mfilter/filter_pages.cache.php и не имеет TTL — он перестраивается по событиям (сохранение/удаление ресурса с привязкой к набору, очистка кэша MODX).
Очистка кэша
Из админки
Обслуживание → Очистить кэш
Очищает:
- Все записи из таблицы
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);Автоматическая инвалидация
Кэш автоматически очищается при:
| Событие MODX | Что делает плагин mFilter |
|---|---|
OnDocFormSave (ресурс с привязкой к набору) | Инвалидирует кэш страницы; перестраивает router cache при смене URI |
OnResourceDelete (ресурс с привязкой к набору) | Перестраивает router cache |
OnCacheUpdate (очистка кэша MODX) | Чистит router cache mFilter |
| Сохранение набора фильтров через UI | Инвалидирует кэш всех страниц набора, пересобирает изменённые ключи в индексе фасетов |
| Удаление набора фильтров через UI | Чистит router cache, инвалидирует кэш страниц |
Подробнее про события: События.
Ручная инвалидация при изменении товаров
После массового импорта или прямых SQL-правок нужно обновить индекс фасетов — только он гарантирует корректные значения и suggestion'ы. Кэш MflCache обновится автоматически при первом запросе.
$mfilter = $modx->services->get('mfilter');
// 1. Пересобрать индекс фасетов (главное)
$mfilter->getFacetIndexBuilder()->buildAll();
// 2. Очистить промежуточный кэш (опционально — он самоинвалидируется)
$mfilter->clearCache();Проще из админки: mFilter → Обслуживание → «Пересобрать сейчас» или кнопка «Переиндексация» в шапке.
Подробнее: Обслуживание, Scheduler-задачи.
Scheduler (фоновые задачи)
mFilter регистрирует семь задач в Scheduler. Связанные с кэшем:
mfl_rebuild_cache— перестройка кэша роутера и фильтров (on-demand)mfl_warmup— прогрев baseIds для AJAX (legacy с 1.4.0)mfl_rebuild_facet_index— полная пересборка индекса фасетов
Полный список с интервалами, параметрами и примерами вызова: Scheduler-задачи.
Отключение кэша
Глобально
Системные настройки → mfilter.cache_enabled → НетДля отладки
При включённом профайлере (mfilter.debug_profiler) в логах видно:
suggestions.cacheHit— попадание в кэшsuggestions.cacheCheck— время проверки кэша
Размер кэша
Проверка в админке
В шапке админки mFilter есть статус-бар, в котором отображается количество записей в кэше ({N} записей). На вкладке Обслуживание в карточке «Кэш данных фильтров» — то же значение в виде Tag.
Программно
// Количество записей в БД
$count = $modx->getCount('MFilter\\Model\\MflCache');
// Файлы кэша
$cachePath = MODX_CORE_PATH . 'cache/mfilter/';
$files = glob($cachePath . '*');Рекомендации
Для небольших каталогов (до 1000 товаров)
- Используйте настройки по умолчанию
- Кэш обновится автоматически при истечении TTL
Для средних каталогов (1000-10000 товаров)
- Увеличьте
cache_lifetimeдо 7200-14400 - Настройте очистку кэша после импорта
Для больших каталогов (10000+ товаров)
С версии 1.4.0 главное — построенный индекс фасетов. С ним фильтрация работает в 5–10 раз быстрее независимо от размера каталога, прогрев кэша становится опциональным.
- После установки/обновления убедитесь, что индекс собран (вкладка Обслуживание → статус «Активен»)
- Кэш
MflCacheоставьте включённым с TTL 3600–7200 — он закроет повторные запросы - Прогрев
baseIds(legacy) включайте только если используете AJAX и нужен мгновенный отклик первого запроса
При частых обновлениях товаров
После каждого массового импорта — пересоберите индекс фасетов одной кнопкой. Промежуточный кэш самоочистится при первом запросе.
При редких обновлениях
Увеличьте TTL mfilter.cache_lifetime до 86400 (сутки). Индекс пересобирается только при изменении набора фильтров и при ручном запуске.
Структура таблицы mfl_cache
| Поле | Тип | Описание |
|---|---|---|
id | int | Первичный ключ |
cache_key | varchar(255) | Уникальный ключ кэша |
cache_value | mediumtext | Сериализованные данные (JSON) |
created_at | datetime | Время создания |
expires_at | datetime | Время истечения |
Индексы:
uk_cache_key— уникальный индекс по ключуidx_expires— индекс для очистки устаревших записей
