|
| 1 | +# Версия 1.2.0: прогрев кэша фильтров |
| 2 | + |
| 3 | +Крупное обновление, добавляющее систему прогрева кэша для мгновенной загрузки страниц каталога с первого обращения. |
| 4 | + |
| 5 | +## Проблема |
| 6 | + |
| 7 | +MySQL 8 медленно выполняет запросы для больших каталогов. Первая загрузка страницы с фильтрами занимала от 15 до 60 секунд на каталогах свыше 10 000 товаров. Узкие места: |
| 8 | + |
| 9 | +- Получение списка ID товаров категории (`ElementRunner::getIds()`) |
| 10 | +- Вычисление доступных значений фильтров (`Filter::getFilters()`) |
| 11 | +- Подсчёт фасетных счётчиков (`Filter::getSuggestionsForIds()`) |
| 12 | + |
| 13 | +## Решение |
| 14 | + |
| 15 | +Система прогрева кэша заранее вычисляет и сохраняет все три тяжёлые операции в базу данных. Прогрев запускается в фоне через Scheduler или вручную из админки. После прогрева страницы каталога открываются за доли секунды. |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## Новые возможности |
| 20 | + |
| 21 | +### Подсистема прогрева (warmup) |
| 22 | + |
| 23 | +Администратор создаёт конфигурацию прогрева в [новой вкладке админки](/components/mfilter/interface/warmup), указывая сниппет и страницы каталога. При прогреве система перебирает все привязанные страницы и кэширует: |
| 24 | + |
| 25 | +1. **baseIds** — список ID товаров категории |
| 26 | +2. **filter values** — значения для формы фильтров |
| 27 | +3. **suggestions** — количество товаров для каждого значения фильтра |
| 28 | + |
| 29 | +### Автосоздание конфигураций |
| 30 | + |
| 31 | +При первом посещении любой страницы каталога конфигурация прогрева создаётся автоматически. Не нужно настраивать каждую страницу вручную — достаточно один раз обойти каталог или дождаться посещения пользователями. |
| 32 | + |
| 33 | +### Парсер вызовов сниппетов |
| 34 | + |
| 35 | +Поле «Вызов сниппета» в редакторе конфигурации принимает код из шаблона и автоматически извлекает параметры. Поддерживаются три формата: |
| 36 | + |
| 37 | +```fenom |
| 38 | +{'!mFilter'|snippet:['element' => 'msProducts', 'parents' => $_modx->resource.id]} |
| 39 | +``` |
| 40 | + |
| 41 | +``` |
| 42 | +[[!mFilter? &element=`msProducts` &parents=`5`]] |
| 43 | +``` |
| 44 | + |
| 45 | +```json |
| 46 | +{"element": "msProducts", "parents": 5} |
| 47 | +``` |
| 48 | + |
| 49 | +### Таск Scheduler |
| 50 | + |
| 51 | +Новый таск `mfl_warmup` выполняет прогрев в фоне по крону. По умолчанию рекуррентный — запускается каждые 50 минут, обновляя кэш с запасом до истечения TTL. |
| 52 | + |
| 53 | +Из админки доступна кнопка **«Через Scheduler»** для запуска прогрева в фоне. |
| 54 | + |
| 55 | +### Вкладка «Прогрев кэша» в админке |
| 56 | + |
| 57 | +Новая вкладка в интерфейсе mFilter: |
| 58 | + |
| 59 | +- Таблица конфигураций с информацией о последнем прогреве |
| 60 | +- Редактор с парсингом вызовов, таблицей параметров и деревом ресурсов |
| 61 | +- Кнопки «Прогреть всё», «Через Scheduler», прогрев отдельной конфигурации |
| 62 | +- Чекбокс «+ счётчики» (включён по умолчанию) |
| 63 | + |
| 64 | +[Подробнее об интерфейсе →](/components/mfilter/interface/warmup) |
| 65 | + |
| 66 | +--- |
| 67 | + |
| 68 | +## Новые модели БД |
| 69 | + |
| 70 | +| Таблица | Описание | |
| 71 | +|---------|----------| |
| 72 | +| `mfl_warmup_configs` | Конфигурации прогрева (element, params, cache_key_hash, статистика) | |
| 73 | +| `mfl_warmup_config_resources` | Привязка конфигураций к страницам каталога (many-to-many) | |
| 74 | + |
| 75 | +Таблицы создаются автоматически при установке или обновлении пакета. |
| 76 | + |
| 77 | +--- |
| 78 | + |
| 79 | +## API |
| 80 | + |
| 81 | +10 новых эндпоинтов для управления конфигурациями: |
| 82 | + |
| 83 | +| Метод | Маршрут | Описание | |
| 84 | +|-------|---------|----------| |
| 85 | +| GET | `/warmup-configs` | Список конфигураций | |
| 86 | +| GET | `/warmup-configs/{id}` | Получить конфигурацию | |
| 87 | +| POST | `/warmup-configs` | Создать | |
| 88 | +| PUT | `/warmup-configs/{id}` | Обновить | |
| 89 | +| DELETE | `/warmup-configs/{id}` | Удалить | |
| 90 | +| POST | `/warmup-configs/{id}/warmup` | Прогреть одну конфигурацию | |
| 91 | +| POST | `/warmup-configs/warmup-all` | Прогреть все | |
| 92 | +| POST | `/warmup-configs/schedule` | Запланировать через Scheduler | |
| 93 | +| POST | `/warmup-configs/parse-snippet` | Распарсить вызов сниппета | |
| 94 | +| GET | `/warmup-configs/resource-tree` | Дерево ресурсов | |
| 95 | + |
| 96 | +--- |
| 97 | + |
| 98 | +## Улучшения |
| 99 | + |
| 100 | +### Кэширование getSuggestionsForIds |
| 101 | + |
| 102 | +Метод `Filter::getSuggestionsForIds()` теперь сохраняет результаты в `mfl_cache`. При повторном обращении с теми же параметрами данные берутся из кэша. |
| 103 | + |
| 104 | +### UTC для временных меток кэша |
| 105 | + |
| 106 | +Все временные метки (`expires_at`, `created_at`, `updated_at`) в кэше теперь хранятся в UTC через `gmdate()`. Это устраняет проблему преждевременного протухания кэша на серверах, где cron работает в UTC, а web-процессы — в локальной таймзоне. |
| 107 | + |
| 108 | +### TvIndexer |
| 109 | + |
| 110 | +`TvIndexer::indexResource()` теперь индексирует только TV, используемые в конфигурации фильтров, вместо всех TV ресурса. Снижает нагрузку при индексации. |
| 111 | + |
| 112 | +### Удалён legacy warm_suggestions |
| 113 | + |
| 114 | +Удалён устаревший механизм прогрева suggestions через HTTP-запросы к страницам (`file_get_contents` с отключённой SSL-верификацией). Заменён прямым вызовом через `mfl_warmup`. |
| 115 | + |
| 116 | +--- |
| 117 | + |
| 118 | +## Настройка под проект |
| 119 | + |
| 120 | +### Интервал прогрева и TTL |
| 121 | + |
| 122 | +| Размер каталога | TTL | Интервал прогрева | Описание | |
| 123 | +|-----------------|-----|-------------------|----------| |
| 124 | +| До 1 000 товаров | 3600 | 3000 | По умолчанию | |
| 125 | +| 1 000 — 10 000 | 7200 | 6000 | Каждые 100 мин | |
| 126 | +| 10 000 — 100 000 | 14400 | 10800 | Каждые 3 часа | |
| 127 | +| 100 000+ | 86400 | 43200 | 2 раза в сутки | |
| 128 | + |
| 129 | +- **TTL** — системная настройка `mfilter.cache_lifetime` |
| 130 | +- **Интервал** — поле `interval` таска `mfl_warmup` в Scheduler |
| 131 | + |
| 132 | +::: warning |
| 133 | +Интервал должен быть меньше TTL. Учитывайте время выполнения прогрева — для каталога в 200 000 товаров прогрев занимает ~30 минут. |
| 134 | +::: |
| 135 | + |
| 136 | +### При обновлении товарной базы |
| 137 | + |
| 138 | +| Сценарий | Действие | |
| 139 | +|----------|----------| |
| 140 | +| Регулярный импорт цен/остатков | Автоматически — рекуррентный таск обновит кэш | |
| 141 | +| Массовый импорт новых товаров | Запустить прогрев вручную из админки | |
| 142 | +| Изменение структуры фильтров | Очистить кэш + запустить прогрев | |
| 143 | + |
| 144 | +--- |
| 145 | + |
| 146 | +## Обновление |
| 147 | + |
| 148 | +### Перед обновлением |
| 149 | + |
| 150 | +1. Сделайте резервную копию базы данных |
| 151 | + |
| 152 | +### После обновления |
| 153 | + |
| 154 | +1. Очистите кэш MODX |
| 155 | +2. Перейдите на вкладку «Прогрев кэша» |
| 156 | +3. Создайте конфигурацию или дождитесь автосоздания при посещении каталога |
| 157 | +4. Запустите прогрев через «Через Scheduler» |
| 158 | +5. Убедитесь, что cron настроен для Scheduler |
| 159 | + |
| 160 | +### Новые таблицы |
| 161 | + |
| 162 | +Таблицы `mfl_warmup_configs` и `mfl_warmup_config_resources` создаются автоматически при установке пакета. |
| 163 | + |
| 164 | +### Новый таск Scheduler |
| 165 | + |
| 166 | +Таск `mfl_warmup` регистрируется автоматически. Если Scheduler не установлен — прогрев доступен только из админки (кнопка «Прогреть всё»). |
| 167 | + |
| 168 | +## Результат |
| 169 | + |
| 170 | +После прогрева на каталоге в 200 000 товаров и 100 категориях: |
| 171 | + |
| 172 | +| Метрика | Без прогрева | С прогревом | |
| 173 | +|---------|-------------|-------------| |
| 174 | +| Первая загрузка страницы | 15–60 сек | < 1 сек | |
| 175 | +| Полный прогрев каталога | — | ~8–30 мин (в фоне) | |
0 commit comments