Skip to content

Commit 1c612fa

Browse files
authored
Merge pull request #867 from modx-pro/mfilter
mFilter версия 1.2.0
2 parents 5c4b5d5 + 04f52c1 commit 1c612fa

File tree

7 files changed

+376
-17
lines changed

7 files changed

+376
-17
lines changed

docs/components/mfilter/cache.md

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,27 @@ return [
4747

4848
Предзагружается при парсинге URL для минимизации запросов к БД.
4949

50+
### 4. Кэш прогрева (БД)
51+
52+
Хранится в таблице `mfl_cache`. Создаётся системой прогрева (warmup) заранее, до первого посещения пользователем.
53+
54+
Кэшируются три типа данных:
55+
56+
- **baseIds** — список ID товаров категории (результат `ElementRunner::getIds()`)
57+
- **filter values** — значения для построения формы фильтров
58+
- **suggestions** — фасетные счётчики (количество товаров для каждого значения)
59+
60+
**Формат ключей:**
61+
```
62+
baseids_{resourceId}_{cacheKeyHash}
63+
filters_{resourceId}_{depth}
64+
suggestions_forids_{resourceId}_{filterHash}
65+
```
66+
67+
Конфигурации прогрева хранятся в таблицах `mfl_warmup_configs` и `mfl_warmup_config_resources`.
68+
69+
Подробнее: [Прогрев кэша](interface/warmup)
70+
5071
## Системные настройки
5172

5273
| Настройка | Описание | По умолчанию |
@@ -105,33 +126,54 @@ $filter->clearCache(0);
105126

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

108-
При массовом обновлении товаров рекомендуется очистить кэш:
129+
При массовом обновлении товаров кэш обновится автоматически рекуррентным таском `mfl_warmup`.
130+
131+
Для немедленного обновления:
109132

110133
```php
111-
// После импорта товаров
112134
$mfilter = $modx->services->get('mfilter');
135+
136+
// Очистить кэш
113137
$mfilter->clearCache();
138+
139+
// Запустить прогрев (если Scheduler установлен)
140+
$mfilter->getWarmupManager()->schedule(true);
114141
```
115142

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

118-
При установленном Scheduler доступна задача перестройки кэша.
145+
При установленном Scheduler доступны две задачи:
146+
147+
### mfl_rebuild_cache — перестройка кэша
119148

120-
### Запуск задачи
149+
Очищает и заново строит кэш роутера и фильтров.
121150

122151
```php
123152
$mfilter = $modx->services->get('mfilter');
124153
$taskId = $mfilter->scheduleCacheRebuild();
125154
```
126155

127-
### Параметры задачи
128-
129156
| Параметр | Описание | По умолчанию |
130157
|----------|----------|--------------|
131158
| `clear_first` | Очистить кэш перед перестройкой | `true` |
132159
| `rebuild_router` | Перестроить кэш роутера | `true` |
133160
| `rebuild_filters` | Перестроить кэш фильтров | `true` |
134161

162+
### mfl_warmup — прогрев кэша
163+
164+
Прогревает baseIds, значения фильтров и фасетные счётчики для всех активных конфигураций. Рекуррентный — запускается каждые 50 минут по умолчанию.
165+
166+
```php
167+
$warmupManager = $mfilter->getWarmupManager();
168+
$runId = $warmupManager->schedule(true); // true = с прогревом счётчиков
169+
```
170+
171+
| Параметр | Описание | По умолчанию |
172+
|----------|----------|--------------|
173+
| `warm_suggestions` | Прогревать фасетные счётчики и значения фильтров | `true` |
174+
175+
Подробнее: [Прогрев кэша](interface/warmup)
176+
135177
## Отключение кэша
136178

137179
### Глобально
@@ -183,29 +225,29 @@ $files = glob($cachePath . '*');
183225

184226
### Для больших каталогов (10000+ товаров)
185227

186-
- Используйте Scheduler для фоновой перестройки
187-
- Настройте cron-задачу на ночное время:
228+
- Настройте [прогрев кэша](interface/warmup) — создайте конфигурацию и привяжите страницы каталога
229+
- Рекуррентный таск `mfl_warmup` будет обновлять кэш автоматически
230+
- Подберите интервал прогрева и TTL под объём каталога и частоту обновлений
188231

189-
```php
190-
// Задача Scheduler
191-
$mfilter->scheduleCacheRebuild();
232+
```
233+
# Пример для каталога 200k товаров (прогрев ~30 мин)
234+
mfilter.cache_lifetime = 7200 # TTL 2 часа
235+
# interval таска = 6000 # прогрев каждые 100 мин
192236
```
193237

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

196-
Если товары обновляются часто (цены, наличие), уменьшите TTL:
240+
Рекуррентный прогрев автоматически обновит кэш. Максимальная задержка = интервал прогрева.
197241

198-
```
199-
mfilter.cache_lifetime = 1800
200-
```
242+
Для немедленного обновления после импорта — запустите `mfl_warmup` вручную из админки.
201243

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

204-
Увеличьте TTL для максимальной производительности:
246+
Увеличьте TTL и интервал прогрева:
205247

206248
```
207249
mfilter.cache_lifetime = 86400
208-
mfilter.cache_router_lifetime = 604800
250+
# interval таска = 43200 # прогрев 2 раза в сутки
209251
```
210252

211253
## Структура таблицы mfl_cache
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
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 мин (в фоне) |

docs/components/mfilter/changelog/index.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,16 @@
44

55
| Версия | Дата | Описание |
66
|--------|------|----------|
7+
| [1.2.0](1.2.0) | 2026 | Прогрев кэша фильтров (warmup) |
78
| [1.1.0](1.1.0) | 2024 | Новые сниппеты, SEO улучшения, рефакторинг |
89
| 1.0.0-beta1 | 2024 | Первый публичный релиз |
910

11+
## mFilter 1.2.0
12+
13+
Подсистема прогрева кэша для мгновенной загрузки страниц каталога с первого обращения. Вкладка «Прогрев кэша» в админке, автосоздание конфигураций, рекуррентный таск Scheduler, фикс таймзон UTC.
14+
15+
[Подробнее о версии 1.2.0 →](1.2.0)
16+
1017
## mFilter 1.1.0
1118

1219
Крупное обновление с новыми возможностями:

docs/components/mfilter/development/models.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
| `mfl_word_forms` | MflWordForm | Словоформы |
1515
| `mfl_page_configs` | MflPageConfig | Конфигурации страниц |
1616
| `mfl_cache` | MflCache | Кэш результатов |
17+
| `mfl_warmup_configs` | MflWarmupConfig | Конфигурации прогрева кэша |
18+
| `mfl_warmup_config_resources` | MflWarmupConfigResource | Привязки конфигураций к страницам |
1719

1820
## MflFilterSet
1921

docs/components/mfilter/development/services.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ $urlRouter = $mfilter->getUrlRouter();
3232
| TemplateParser | `Services\Seo\TemplateParser` | Парсинг SEO-шаблонов |
3333
| WordFormsManager | `Services\Seo\WordFormsManager` | Управление словоформами |
3434
| ElementRunner | `Services\Element\ElementRunner` | Запуск element/paginator |
35+
| WarmupManager | `Services\Warmup\WarmupManager` | Управление прогревом кэша |
36+
| WarmupKeyBuilder | `Services\Warmup\WarmupKeyBuilder` | Построение ключей кэша |
37+
| SnippetCallParser | `Services\Warmup\SnippetCallParser` | Парсинг вызовов сниппетов |
3538
| Profiler | `Services\Profiler` | Профилирование запросов |
3639

3740
## Получение сервисов

docs/components/mfilter/interface/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
| [Паттерны URL](patterns) | Правила распознавания URL |
1212
| [SEO шаблоны](seo-templates) | Шаблоны для генерации метаданных |
1313
| [Словоформы](word-forms) | Склонение слов для SEO-текстов |
14+
| [Прогрев кэша](warmup) | Управление прогревом кэша фильтров |
1415
| [Обслуживание](maintenance) | Переиндексация, очистка кэша |
1516

1617
## Общий вид

0 commit comments

Comments
 (0)