
Версия 1.2.0: прогрев кэша фильтров
Крупное обновление, добавляющее систему прогрева кэша для мгновенной загрузки страниц каталога с первого обращения.
Проблема
MySQL 8 медленно выполняет запросы для больших каталогов. Первая загрузка страницы с фильтрами занимала от 15 до 60 секунд на каталогах свыше 10 000 товаров. Узкие места:
- Получение списка ID товаров категории (
ElementRunner::getIds()) - Вычисление доступных значений фильтров (
Filter::getFilters()) - Подсчёт фасетных счётчиков (
Filter::getSuggestionsForIds())
Решение
Система прогрева кэша заранее вычисляет и сохраняет все три тяжёлые операции в базу данных. Прогрев запускается в фоне через Scheduler или вручную из админки. После прогрева страницы каталога открываются за доли секунды.
Новые возможности
Подсистема прогрева (warmup)
Администратор создаёт конфигурацию прогрева в новой вкладке админки, указывая сниппет и страницы каталога. При прогреве система перебирает все привязанные страницы и кэширует:
- baseIds — список ID товаров категории
- filter values — значения для формы фильтров
- suggestions — количество товаров для каждого значения фильтра
Автосоздание конфигураций
При первом посещении любой страницы каталога конфигурация прогрева создаётся автоматически. Не нужно настраивать каждую страницу вручную — достаточно один раз обойти каталог или дождаться посещения пользователями.
Парсер вызовов сниппетов
Поле «Вызов сниппета» в редакторе конфигурации принимает код из шаблона и автоматически извлекает параметры. Поддерживаются три формата:
{'!mFilter'|snippet:['element' => 'msProducts', 'parents' => $_modx->resource.id]}[[!mFilter? &element=`msProducts` &parents=`5`]]{"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 товаров | 3600 | 3000 | По умолчанию |
| 1 000 — 10 000 | 7200 | 6000 | Каждые 100 мин |
| 10 000 — 100 000 | 14400 | 10800 | Каждые 3 часа |
| 100 000+ | 86400 | 43200 | 2 раза в сутки |
- TTL — системная настройка
mfilter.cache_lifetime - Интервал — поле
intervalтаскаmfl_warmupв Scheduler
Внимание
Интервал должен быть меньше TTL. Учитывайте время выполнения прогрева — для каталога в 200 000 товаров прогрев занимает ~30 минут.
При обновлении товарной базы
| Сценарий | Действие |
|---|---|
| Регулярный импорт цен/остатков | Автоматически — рекуррентный таск обновит кэш |
| Массовый импорт новых товаров | Запустить прогрев вручную из админки |
| Изменение структуры фильтров | Очистить кэш + запустить прогрев |
Обновление
Перед обновлением
- Сделайте резервную копию базы данных
После обновления
- Очистите кэш MODX
- Перейдите на вкладку «Прогрев кэша»
- Создайте конфигурацию или дождитесь автосоздания при посещении каталога
- Запустите прогрев через «Через Scheduler»
- Убедитесь, что cron настроен для Scheduler
Новые таблицы
Таблицы mfl_warmup_configs и mfl_warmup_config_resources создаются автоматически при установке пакета.
Новый таск Scheduler
Таск mfl_warmup регистрируется автоматически. Если Scheduler не установлен — прогрев доступен только из админки (кнопка «Прогреть всё»).
Результат
После прогрева на каталоге в 200 000 товаров и 100 категориях:
| Метрика | Без прогрева | С прогревом |
|---|---|---|
| Первая загрузка страницы | 15–60 сек | < 1 сек |
| Полный прогрев каталога | — | ~8–30 мин (в фоне) |
