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

Версия 1.2.0: прогрев кэша фильтров

Крупное обновление, добавляющее систему прогрева кэша для мгновенной загрузки страниц каталога с первого обращения.

Проблема

MySQL 8 медленно выполняет запросы для больших каталогов. Первая загрузка страницы с фильтрами занимала от 15 до 60 секунд на каталогах свыше 10 000 товаров. Узкие места:

  • Получение списка ID товаров категории (ElementRunner::getIds())
  • Вычисление доступных значений фильтров (Filter::getFilters())
  • Подсчёт фасетных счётчиков (Filter::getSuggestionsForIds())

Решение

Система прогрева кэша заранее вычисляет и сохраняет все три тяжёлые операции в базу данных. Прогрев запускается в фоне через Scheduler или вручную из админки. После прогрева страницы каталога открываются за доли секунды.


Новые возможности

Подсистема прогрева (warmup)

Администратор создаёт конфигурацию прогрева в новой вкладке админки, указывая сниппет и страницы каталога. При прогреве система перебирает все привязанные страницы и кэширует:

  1. baseIds — список ID товаров категории
  2. filter values — значения для формы фильтров
  3. suggestions — количество товаров для каждого значения фильтра

Автосоздание конфигураций

При первом посещении любой страницы каталога конфигурация прогрева создаётся автоматически. Не нужно настраивать каждую страницу вручную — достаточно один раз обойти каталог или дождаться посещения пользователями.

Парсер вызовов сниппетов

Поле «Вызов сниппета» в редакторе конфигурации принимает код из шаблона и автоматически извлекает параметры. Поддерживаются три формата:

fenom
{'!mFilter'|snippet:['element' => 'msProducts', 'parents' => $_modx->resource.id]}
[[!mFilter? &element=`msProducts` &parents=`5`]]
json
{"element": "msProducts", "parents": 5}

Таск Scheduler

Новый таск mfl_warmup выполняет прогрев в фоне по крону. По умолчанию рекуррентный — запускается каждые 50 минут, обновляя кэш с запасом до истечения TTL.

Из админки доступна кнопка «Через Scheduler» для запуска прогрева в фоне.

Вкладка «Прогрев кэша» в админке

Новая вкладка в интерфейсе mFilter:

  • Таблица конфигураций с информацией о последнем прогреве
  • Редактор с парсингом вызовов, таблицей параметров и деревом ресурсов
  • Кнопки «Прогреть всё», «Через Scheduler», прогрев отдельной конфигурации
  • Чекбокс «+ счётчики» (включён по умолчанию)

Подробнее об интерфейсе →


Новые модели БД

ТаблицаОписание
mfl_warmup_configsКонфигурации прогрева (element, params, cache_key_hash, статистика)
mfl_warmup_config_resourcesПривязка конфигураций к страницам каталога (many-to-many)

Таблицы создаются автоматически при установке или обновлении пакета.


API

10 новых эндпоинтов для управления конфигурациями:

МетодМаршрутОписание
GET/warmup-configsСписок конфигураций
GET/warmup-configs/{id}Получить конфигурацию
POST/warmup-configsСоздать
PUT/warmup-configs/{id}Обновить
DELETE/warmup-configs/{id}Удалить
POST/warmup-configs/{id}/warmupПрогреть одну конфигурацию
POST/warmup-configs/warmup-allПрогреть все
POST/warmup-configs/scheduleЗапланировать через Scheduler
POST/warmup-configs/parse-snippetРаспарсить вызов сниппета
GET/warmup-configs/resource-treeДерево ресурсов

Улучшения

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

Метод Filter::getSuggestionsForIds() теперь сохраняет результаты в mfl_cache. При повторном обращении с теми же параметрами данные берутся из кэша.

UTC для временных меток кэша

Все временные метки (expires_at, created_at, updated_at) в кэше теперь хранятся в UTC через gmdate(). Это устраняет проблему преждевременного протухания кэша на серверах, где cron работает в UTC, а web-процессы — в локальной таймзоне.

TvIndexer

TvIndexer::indexResource() теперь индексирует только TV, используемые в конфигурации фильтров, вместо всех TV ресурса. Снижает нагрузку при индексации.

Удалён legacy warm_suggestions

Удалён устаревший механизм прогрева suggestions через HTTP-запросы к страницам (file_get_contents с отключённой SSL-верификацией). Заменён прямым вызовом через mfl_warmup.


Настройка под проект

Интервал прогрева и TTL

Размер каталогаTTLИнтервал прогреваОписание
До 1 000 товаров36003000По умолчанию
1 000 — 10 00072006000Каждые 100 мин
10 000 — 100 0001440010800Каждые 3 часа
100 000+86400432002 раза в сутки
  • TTL — системная настройка mfilter.cache_lifetime
  • Интервал — поле interval таска mfl_warmup в Scheduler

Внимание

Интервал должен быть меньше TTL. Учитывайте время выполнения прогрева — для каталога в 200 000 товаров прогрев занимает ~30 минут.

При обновлении товарной базы

СценарийДействие
Регулярный импорт цен/остатковАвтоматически — рекуррентный таск обновит кэш
Массовый импорт новых товаровЗапустить прогрев вручную из админки
Изменение структуры фильтровОчистить кэш + запустить прогрев

Обновление

Перед обновлением

  1. Сделайте резервную копию базы данных

После обновления

  1. Очистите кэш MODX
  2. Перейдите на вкладку «Прогрев кэша»
  3. Создайте конфигурацию или дождитесь автосоздания при посещении каталога
  4. Запустите прогрев через «Через Scheduler»
  5. Убедитесь, что cron настроен для Scheduler

Новые таблицы

Таблицы mfl_warmup_configs и mfl_warmup_config_resources создаются автоматически при установке пакета.

Новый таск Scheduler

Таск mfl_warmup регистрируется автоматически. Если Scheduler не установлен — прогрев доступен только из админки (кнопка «Прогреть всё»).

Результат

После прогрева на каталоге в 200 000 товаров и 100 категориях:

МетрикаБез прогреваС прогревом
Первая загрузка страницы15–60 сек< 1 сек
Полный прогрев каталога~8–30 мин (в фоне)