
Кэширование
mFilter хранит промежуточные данные в таблице mfl_cache, в двух файлах в core/cache/mfilter/ и в сессии посетителя. Главный механизм скорости — индекс фасетов; кэш закрывает повторные запросы к одной и той же выборке.
Что кэшируется
Таблица mfl_cache
| Ключ | Что хранит | Кто пишет |
|---|---|---|
suggestions_{resourceId}_{hash} | Счётчики значений на страницах без &element | Сниппет mFilter, запросы фильтрации |
suggestions_forids_{resourceId}_{hash} | Счётчики значений по списку товаров страницы | mFilter с &element, mFilterForm, mFilterNav, запросы фильтрации, прогрев |
filters_{resourceId}_{depth} | Значения фильтров для запроса GET /filters и редактора индивидуальных SEO. Форма mFilterForm их не читает | GET /filters, редактор, прогрев, задача mfl_rebuild_cache |
baseids_{resourceId}_{hash} | Список товаров страницы с &element | Прогрев, запрос фильтрации, если списка ещё нет |
Прогрев заполняет baseids_* заранее, а с флажком «+ счётчики» — ещё filters_* и suggestions_forids_*.
В той же таблице лежат служебные записи: параметры вызова сниппетов (snippet_config_*) и метки индекса фасетов (facet_index.*). Срок mfilter.cache_lifetime к ним не относится. Метки индекса очистка не удаляет никогда, параметры вызова — только если их не запрашивали от двух недель до месяца.
Просроченная запись удаляется, когда её прочтут, или кнопкой «Очистить кэш». Отдельной уборки нет.
Файлы
Оба файла лежат в core/cache/mfilter/ и срока жизни не имеют.
| Файл | Что хранит |
|---|---|
filter_pages.cache.php | Кэш адресов: адрес страницы → ID ресурса. По нему разбираются SEO-адреса фильтров. В него попадают все опубликованные страницы с набором, включая подразделы с набором по наследованию, и страницы, где вызван mFilter |
filter_sets.cache.php | Карта «страница → набор» |
Создание, публикация и перенос раздела карту наборов не обновляют. Нажмите «Пересобрать кэш» на вкладке Наборы фильтров, иначе новый раздел останется без фильтров.
Так выглядит кэш адресов:
<?php
// mFilter filter pages cache
// Generated: 2026-11-02 10:00:00
return [
'catalog' => 5,
'catalog/phones' => 12,
'catalog/tablets' => 15,
];Сессия посетителя
На страницах с &element в сессии лежат список товаров для фильтрации без перезагрузки и полные границы диапазонов. Их не сбрасывают ни кнопки, ни задачи, ни настройка mfilter.cache_enabled — они обновляются, когда посетитель заново открывает страницу.
Системные настройки
| Настройка | Описание | По умолчанию |
|---|---|---|
mfilter.cache_enabled | Кэш значений, счётчиков и прогретых списков в mfl_cache. Кэш адресов, карта наборов и сессия работают всегда | true |
mfilter.cache_lifetime | Срок значений, счётчиков и списков товаров в mfl_cache, секунды | 3600 |
Очистка кэша
Кнопками в админке
| Данные | «Очистить кэш», вкладка «Обслуживание» | «Пересобрать кэш», вкладка «Наборы фильтров» |
|---|---|---|
Записи mfl_cache, кроме служебных, вместе с прогретыми списками товаров | Удаляет | Удаляет |
| Параметры вызова сниппетов | Удаляет те, что не запрашивали от двух недель до месяца | Не трогает |
| Метки индекса фасетов | Не трогает | Не трогает |
| Кэш адресов | Удаляет | Не трогает |
| Карта наборов | Удаляет | Строит заново |
После очистки страницы остаются непрогретыми до ближайшего прогрева. Счётчик записей после «Очистить кэш» не нулевой: служебные записи остаются.
Из кода
$mfilter = $modx->services->get('mfilter');
// Очистить весь кэш: таблица (кроме служебных записей) и оба файла
$mfilter->clearCache();
// Очистить кэш конкретной страницы
$mfilter->invalidatePageCache($resourceId);
// Перестроить кэш адресов
$mfilter->rebuildRouterCache();Через сервис Filter:
$filter = $mfilter->getFilter();
// Очистить кэш для ресурса
$filter->clearCache($resourceId);
// Очистить весь кэш фильтров
$filter->clearCache(0);Автоматическая инвалидация
| Событие | Что делает mFilter |
|---|---|
Сохранение ресурса с привязкой к набору (OnDocFormSave) | Сбрасывает кэш этой страницы |
Очистка кэша MODX (OnCacheUpdate) — в том числе при сохранении любого ресурса с отмеченной «Очистить кэш» | Удаляет файл кэша адресов; следующий запрос строит его заново. Таблицу mfl_cache очистка кэша MODX не трогает |
Удаление ресурса с привязкой к набору (OnResourceDelete) | Перестраивает кэш адресов |
| Сохранение и удаление товара, синхронизация индекса по расписанию | Обновляет строки товара в индексе фасетов и сбрасывает кэш значений и счётчиков у страниц каталога, в дерево которых попадает товар — через родителя и дополнительные категории MiniShop3 |
| Сохранение набора фильтров | Сбрасывает карту наборов и кэш страниц набора. Если фильтры в наборе изменились — пересобирает их в индексе фасетов, затем сбрасывает кэш значений и счётчиков всего сайта |
| Удаление набора фильтров | Сбрасывает карту наборов и кэш страниц набора. Кэш адресов обновится при ближайшей очистке кэша MODX |
| Сборка индекса фасетов — кнопкой, задачей Scheduler, после импорта MiniShop3 | Сбрасывает кэш значений и счётчиков всего сайта, даже если оборвалась. Прогретые списки товаров не трогает. Если настроен прогрев и установлен Scheduler, ближайший прогрев переносится на «сейчас» — кроме оборвавшейся сборки |
После правки товара прежние числа держатся до конца срока mfilter.cache_lifetime в двух случаях:
- у страницы, чей список товаров задаёт не её дерево:
&parents,&resources, поиск; - у категории, из которой товар перенесли.
Смена адреса раздела без очистки кэша
Если сменить адрес раздела с фильтрами и сохранить со снятой «Очистить кэш», адреса фильтров под новым адресом отдают 404, пока не очистить кэш MODX.
Подробнее про события — События.
После импорта товаров
После массового импорта или прямых SQL-правок пересоберите индекс фасетов — значения фильтров и счётчики берутся из него. Проще всего из админки: mFilter → Обслуживание → «Пересобрать сейчас» или кнопка «Переиндексация» в шапке.
Кэш значений и счётчиков сборка сбросит сама. Прогретые списки товаров она не трогает: нажмите «Прогреть всё» или «Очистить кэш», иначе новые товары появятся в списках, только когда истечёт срок кэша.
Из кода:
$mfilter = $modx->services->get('mfilter');
// Пересобрать индекс фасетов; кэш значений и счётчиков сборка сбросит сама
$mfilter->getFacetIndexBuilder()->buildAll();Подробнее: Обслуживание, Scheduler-задачи.
Фоновые задачи Scheduler
mFilter регистрирует восемь задач в Scheduler. С кэшем чаще всего связаны четыре:
| Задача | Что делает |
|---|---|
mfl_rebuild_cache | Перестраивает кэш адресов и фильтров. mFilter сам её не ставит — только Scheduler или ваш код |
mfl_warmup | Прогревает списки товаров на страницах и, по умолчанию, счётчики значений |
mfl_rebuild_facet_index | Полностью пересобирает индекс фасетов |
mfl_reindex_slugs | Удаляет весь кэш и оба файла, затем перестраивает кэш адресов. Задачу ставит кнопка «Переиндексация» |
Все задачи с интервалами, параметрами и примерами вызова — в разделе Scheduler-задачи.
Отключение кэша
Поставьте системной настройке mfilter.cache_enabled значение «Нет».
Попал ли запрос в кэш
Включите mfilter.debug_profiler — под формой фильтров появится панель замеров. Ищите в ней операции:
suggestions.cacheHit— попадание в кэш; если операции нет, счётчики считались заново;getBaseIds.fromWarmup,getBaseIds.fromSessionилиgetBaseIds.fromElement— откуда взят список товаров. Эти строки появляются после фильтрации без перезагрузки на страницах, гдеmFilterвызван с&element.

Подробнее о панели замеров — в Сервисах.
Размер кэша
Число записей показано на вкладке Обслуживание, в карточке «Кэш данных фильтров». В него входят служебные и просроченные записи.
Из кода:
// Количество записей в БД, включая служебные и просроченные
$count = $modx->getCount('MFilter\\Model\\MflCache');
// Файлы кэша
$cachePath = MODX_CORE_PATH . 'cache/mfilter/';
$files = glob($cachePath . '*');Рекомендации
| Каталог | mfilter.cache_lifetime, секунды |
|---|---|
| До 1000 товаров | По умолчанию |
| 1000–10 000 товаров | 7200–14400 |
| От 10 000 товаров | 3600–7200 |
| Товары обновляются редко | 86400 (сутки) |
При частых обновлениях товаров пересобирайте индекс фасетов после каждого массового импорта — см. После импорта товаров.
Каталог от 10 000 товаров
С версии 1.4.0 главное — собранный индекс фасетов, прогрев кэша необязателен.
- После установки или обновления проверьте, что индекс собран: вкладка Обслуживание → статус «Активен».
- Кэш в
mfl_cacheоставьте включённым — он закроет повторные запросы. - Прогрев списков товаров нужен только страницам, где
mFilterвызван с&element: он ускоряет и первое открытие, и фильтрацию без перезагрузки.
Долгий срок кэша
Чем больше срок, тем дольше держатся прогретые списки товаров и прежние числа в двух случаях из раздела Автоматическая инвалидация. При сроке в сутки страница с &element без Scheduler покажет после импорта старый список до суток.
Структура таблицы mfl_cache
Поля и индексы — в Моделях и БД. Индекс idx_expires используется при уборке старых параметров вызова сниппетов.
