
Кэширование
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. Служебные остаются: параметры вызова сниппетов, по которым AJAX восстанавливает чанки, и метки индекса фасетов - Файл
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, инвалидирует кэш страниц |
| Сборка индекса фасетов — кнопкой, задачей Scheduler, после импорта MiniShop3 | Сбрасывает кэш значений и счётчиков всего сайта, даже если оборвалась. Если настроен прогрев — переносит его на ближайший запуск планировщика |
Сохранение отдельного товара кэш его категорий не сбрасывает: числа там обновятся, когда истечёт mfilter.cache_lifetime.
Подробнее про события: События.
Ручная инвалидация при изменении товаров
После массового импорта или прямых SQL-правок пересоберите индекс фасетов — значения фильтров и счётчики берутся из него. Кэш значений и счётчиков сборка сбросит сама.
$mfilter = $modx->services->get('mfilter');
// Пересобрать индекс фасетов; кэш значений и счётчиков сборка сбросит сама
$mfilter->getFacetIndexBuilder()->buildAll();Проще из админки: mFilter → Обслуживание → «Пересобрать сейчас» или кнопка «Переиндексация» в шапке.
Подробнее: Обслуживание, Scheduler-задачи.
Scheduler (фоновые задачи)
mFilter регистрирует семь задач в Scheduler. Связанные с кэшем:
mfl_rebuild_cache— перестройка кэша роутера и фильтров (on-demand)mfl_warmup— прогрев списков товаров на страницах и, по умолчанию, счётчиков значений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 - После импорта в обход MODX запускайте «Переиндексацию» в шапке админки — она пересоберёт индекс фасетов и сбросит кэш
Для больших каталогов (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— индекс для очистки устаревших записей
