Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  • MODX 3
  • PHP 8.1
  • Vue 3
  1. Компоненты
  2. mFilter
  3. Кэширование

Кэширование ​

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
<?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, кроме служебных, вместе с прогретыми списками товаровУдаляетУдаляет
Параметры вызова сниппетовУдаляет те, что не запрашивали от двух недель до месяцаНе трогает
Метки индекса фасетовНе трогаетНе трогает
Кэш адресовУдаляетНе трогает
Карта наборовУдаляетСтроит заново

После очистки страницы остаются непрогретыми до ближайшего прогрева. Счётчик записей после «Очистить кэш» не нулевой: служебные записи остаются.

Из кода ​

php
$mfilter = $modx->services->get('mfilter');

// Очистить весь кэш: таблица (кроме служебных записей) и оба файла
$mfilter->clearCache();

// Очистить кэш конкретной страницы
$mfilter->invalidatePageCache($resourceId);

// Перестроить кэш адресов
$mfilter->rebuildRouterCache();

Через сервис Filter:

php
$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 → Обслуживание → «Пересобрать сейчас» или кнопка «Переиндексация» в шапке.

Кэш значений и счётчиков сборка сбросит сама. Прогретые списки товаров она не трогает: нажмите «Прогреть всё» или «Очистить кэш», иначе новые товары появятся в списках, только когда истечёт срок кэша.

Из кода:

php
$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.

Панель замеров после повторного выбора того же значения: есть строки suggestions.cacheHit и getBaseIds.fromWarmup

Подробнее о панели замеров — в Сервисах.

Размер кэша ​

Число записей показано на вкладке Обслуживание, в карточке «Кэш данных фильтров». В него входят служебные и просроченные записи.

Из кода:

php
// Количество записей в БД, включая служебные и просроченные
$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 используется при уборке старых параметров вызова сниппетов.