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Время жизни кэша фильтров (сек)3600
mfilter.cache_router_lifetimeВремя жизни кэша роутера (сек)86400

Очистка кэша

Из админки

Обслуживание → Очистить кэш

Очищает:

  • Все записи из таблицы 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);

Автоматическая инвалидация

Кэш автоматически очищается при:

СобытиеЧто очищается
Сохранение набора фильтровКэш страниц набора
Удаление набора фильтровКэш всех страниц
Изменение привязок набораКэш роутера

Ручная инвалидация при изменении товаров

При массовом обновлении товаров кэш обновится автоматически рекуррентным таском mfl_warmup.

Для немедленного обновления:

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

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

// Запустить прогрев (если Scheduler установлен)
$mfilter->getWarmupManager()->schedule(true);

Scheduler (фоновые задачи)

При установленном Scheduler доступны две задачи:

mfl_rebuild_cache — перестройка кэша

Очищает и заново строит кэш роутера и фильтров.

php
$mfilter = $modx->services->get('mfilter');
$taskId = $mfilter->scheduleCacheRebuild();
ПараметрОписаниеПо умолчанию
clear_firstОчистить кэш перед перестройкойtrue
rebuild_routerПерестроить кэш роутераtrue
rebuild_filtersПерестроить кэш фильтровtrue

mfl_warmup — прогрев кэша

Прогревает baseIds, значения фильтров и фасетные счётчики для всех активных конфигураций. Рекуррентный — запускается каждые 50 минут по умолчанию.

php
$warmupManager = $mfilter->getWarmupManager();
$runId = $warmupManager->schedule(true); // true = с прогревом счётчиков
ПараметрОписаниеПо умолчанию
warm_suggestionsПрогревать фасетные счётчики и значения фильтровtrue

Подробнее: Прогрев кэша

Отключение кэша

Глобально

Системные настройки → mfilter.cache_enabled → Нет

Для отладки

При включённом профайлере (mfilter.debug_profiler) в логах видно:

  • suggestions.cacheHit — попадание в кэш
  • suggestions.cacheCheck — время проверки кэша

Размер кэша

Проверка в админке

mFilter → Обслуживание → Статус системы

Показывает:

  • Количество записей в кэше
  • Количество файлов кэша

Программно

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+ товаров)

  • Настройте прогрев кэша — создайте конфигурацию и привяжите страницы каталога
  • Рекуррентный таск mfl_warmup будет обновлять кэш автоматически
  • Подберите интервал прогрева и TTL под объём каталога и частоту обновлений
# Пример для каталога 200k товаров (прогрев ~30 мин)
mfilter.cache_lifetime = 7200    # TTL 2 часа
# interval таска = 6000          # прогрев каждые 100 мин

При частых обновлениях товаров

Рекуррентный прогрев автоматически обновит кэш. Максимальная задержка = интервал прогрева.

Для немедленного обновления после импорта — запустите mfl_warmup вручную из админки.

При редких обновлениях

Увеличьте TTL и интервал прогрева:

mfilter.cache_lifetime = 86400
# interval таска = 43200  # прогрев 2 раза в сутки

Структура таблицы mfl_cache

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

Индексы:

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