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

Кэширование

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
<?php
// mFilter filter pages cache
return [
    'catalog/' => 5,
    'catalog/phones/' => 12,
    'catalog/tablets/' => 15,
];

3. Кэш слагов (память)

Хранится в памяти во время выполнения запроса:

  • slugCache — value → slug
  • valueCache — 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

Программно

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

// Очистить весь кэш
$mfilter->clearCache();

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

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

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

php
$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 обновится автоматически при первом запросе.

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

Программно

php
// Количество записей в БД
$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

ПолеТипОписание
idintПервичный ключ
cache_keyvarchar(255)Уникальный ключ кэша
cache_valuemediumtextСериализованные данные (JSON)
created_atdatetimeВремя создания
expires_atdatetimeВремя истечения

Индексы:

  • uk_cache_key — уникальный индекс по ключу
  • idx_expires — индекс для очистки устаревших записей