
Scheduler-задачи
mFilter регистрирует в Scheduler восемь задач. Четыре повторяются сами, остальные ставят в очередь кнопки админки, события и ваш код.
Scheduler не обязателен
Без него mFilter работает:
| Задача | Без Scheduler |
|---|---|
mfl_sync_facet_index | Не работает. Изменения, которые прошли мимо плагина mFilter, попадают в индекс только при пересборке |
mfl_rebuild_facet_index | Кнопка «Пересобрать сейчас» на вкладке «Обслуживание» собирает индекс синхронно |
mfl_warmup | Кэш не прогревается — первый запрос к странице дольше |
mfl_generate_sitemap | Карта в файл не сохраняется, сниппет работает |
mfl_cleanup_request_ids | Строки после оборванных запросов копятся, пока их не удалить вручную |
| Остальные | Не запускаются |
Задачи выполняет запуск Scheduler из cron — без cron они только стоят в очереди. mFilter регистрирует задачи при установке и обновлении, если Scheduler к этому моменту уже установлен. Поставили Scheduler позже — переустановите пакет mFilter.
Список задач
| Задача | Повторяется | Что делает |
|---|---|---|
mfl_sync_facet_index | каждые 5 минут | Обновляет индекс фасетов для товаров с новым editedon |
mfl_rebuild_facet_index | нет | Пересобирает индекс фасетов целиком |
mfl_warmup | каждые 50 минут | Прогревает кэш страниц с фильтрами |
mfl_generate_sitemap | каждый день | Сохраняет карту сайта в файл |
mfl_cleanup_request_ids | каждые 10 минут | Чистит mfl_request_ids после оборванных запросов |
mfl_reindex_slugs | нет | Создаёт недостающие SEO-алиасы значений |
mfl_generate_word_forms | нет | Не работает |
mfl_rebuild_cache | нет | Очищает и перестраивает кэш mFilter |
mfl_sync_facet_index
С версии 1.4.1. Находит товары, у которых editedon новее прошлого запуска, и пересобирает индекс только для них, пачками по 5000. Товары, удалённые в корзину, находит по deletedon и убирает из индекса.
Повторяется: каждые 5 минут.
Задача видит только изменения, после которых у ресурса в modx_site_content обновлён editedon. Его ставят процессоры MODX: правка в менеджере и вызов через runProcessor(). Задача не видит:
$resource->save()без процессора — он не меняетeditedon;setTVValue()— он сохраняет только значение TV;- импорт, который пишет в таблицы MiniShop3 напрямую и не обновляет
editedonу ресурса; - публикацию по дате — MODX публикует такой товар прямым запросом, без
editedon; DELETE FROM modx_site_content.
В таких случаях обновите editedon ресурса в своём коде или вызовите buildForProducts() в конце скрипта — см. Синхронизация индекса фасетов.
Первый запуск каталог не пересобирает — только запоминает текущее время. Время прошлого запуска хранится в mfl_cache под ключом facet_index.last_sync_at. Пока идёт полная пересборка, синхронизация пропускается до следующего запуска.
// Запуск вне расписания
$mfilter->getFacetIndexBuilder()->syncByEditedon();
// ['synced' => N, 'removed' => N, 'until' => ts, 'chunks' => N, 'duration_ms' => N]Если какой-то фильтр не записался, в результате есть ключ failed_keys, а время прошлого запуска не сдвигается — следующий запуск повторит те же товары.
mfl_rebuild_facet_index
С версии 1.4.0. Пересобирает таблицы mfl_facet_index_text и mfl_facet_index_num целиком — из товаров, опций, TV и ресурсов.
Повторяется: нет.
Когда ставится в очередь:
- при установке и обновлении mFilter;
- кнопкой «Через Scheduler» на вкладке «Обслуживание» и кнопкой «Переиндексация» в шапке админки;
- после импорта MiniShop3 — событие
msOnAfterImport; - из вашего кода — см. Запуск из кода.
Когда запускать вручную: после прямых SQL-правок в таблицах товаров и опций, а также если фильтры расходятся с товарами.
Сколько заняла пересборка, видно в журнале MODX: строка Facet index rebuild done, время — последнее число, в миллисекундах.
Если пересборка уже идёт, запуск встаёт в очередь на две минуты позже, в журнале — строка Facet index rebuild postponed. Так повторяется до 60 раз, около двух часов. Потом запуск сдаётся, в журнале — Facet index rebuild gave up: проверьте, не зависла ли блокировка. Подробнее: Обслуживание → Две пересборки одновременно не идут.
Так выглядят эти строки в журнале. Последнее число строки done — время пересборки в миллисекундах:
[mFilter] Facet index rebuild done: 2 filters, 170 text rows, 100 num rows, 210ms
[mFilter] Facet index rebuild postponed: another rebuild is running, queued again for +2 minutes (attempt 1)
[mFilter] Facet index rebuild gave up after 60 attempts: the index has been locked by another rebuild all this timeЕженедельная пересборка
Для страховки от расхождений задачу можно сделать повторяющейся: флажок «Циклическое» и интервал в Scheduler. Обновление mFilter флажок снимает — после обновления включите его снова.
Подробнее: Обслуживание → Индекс фасетов.
mfl_warmup
Устарела с версии 1.4.0
С появлением индекса фасетов прогрев почти не нужен — значения и счётчики значений читаются из индекса. Задача оставлена, чтобы прогревать списки товаров (baseIds) на страницах, где mFilter вызван с &element. После стабилизации индекса будет упрощена или удалена.
Прогревает списки товаров для всех активных конфигураций прогрева.
Повторяется: каждые 50 минут — с запасом 10 минут до срока кэша по умолчанию, 3600 секунд.
Когда ещё запускается: сразу после пересборки индекса, если есть активные конфигурации прогрева, и кнопкой «Через Scheduler» в блоке «Прогрев baseIds» на вкладке «Обслуживание».
| Параметр | По умолчанию | Описание |
|---|---|---|
warm_suggestions | true | Прогревать и счётчики значений |
$runId = $mfilter->getWarmupManager()->schedule(true);Подробнее: Прогрев кэша.
mfl_generate_sitemap
Обходит страницы с наборами фильтров, собирает адреса одиночных фильтров (при maxFilters = 2 — и пар) и сохраняет XML в файл.
Повторяется: каждый день.
Карта задачи отличается от карты сниппета:
- сниппет отдаёт XML в ответе на запрос, а не в файл;
- в карту задачи попадают значения без товаров в разделе;
- пары собираются из всех сочетаний;
- адреса начинаются с
http://— задача работает из консоли.
Подробнее — на странице mFilterSitemap.
Параметры задачи
| Параметр | По умолчанию | Описание |
|---|---|---|
filename | sitemap-filters.xml | Имя файла в корне сайта |
parents | '' | ID страниц с наборами фильтров; пусто — все |
filterKeys | '' | Ключи фильтров через запятую |
maxFilters | 1 | 1 — только одиночные фильтры, 2 — и пары |
priority | 0.7 | Приоритет адреса в карте |
changefreq | weekly | Частота обновления |
Свои значения передавайте данными запуска, а не правкой файла core/components/mfilter/elements/tasks/generateSitemap.php. В нём заданы значения по умолчанию, и правка пропадёт при обновлении пакета.
$mfilter->scheduleTaskOnce('mfl_generate_sitemap', '+0 seconds', [
'parents' => '5',
'filename' => 'sitemap-catalog.xml',
]);Ближайший запуск ежесуточной цепочки переносится на «сейчас» и получает эти данные. Следующие запуски снова берут значения из файла.
mfl_cleanup_request_ids
С версии 1.4.0. Удаляет строки старше 30 минут из mfl_request_ids и mfl_request_runs (см. RequestIdsRegistry) и пишет в журнал, сколько удалила. Срок задан в коде.
Повторяется: каждые 10 минут.
В обычной работе строки удаляет RequestIdsRegistry сразу по окончании запроса, в том числе после фатальной ошибки PHP. Задаче остаются случаи, когда процесс оборвался целиком: kill -9 или аварийное падение PHP.
Подсказка
Если задача регулярно удаляет много строк, процессы PHP обрываются. Проверьте журналы MODX и сервера.
mfl_reindex_slugs
Создаёт недостающие SEO-алиасы значений фильтров.
Повторяется: нет.
Когда ставится в очередь:
- кнопкой «Переиндексация» в шапке админки — вместе с пересборкой индекса фасетов;
- из вашего кода — например, после добавления фильтров в набор, если выключена настройка
mfilter.slugs_auto_generate.
Что делает:
- Индексирует значения TV, если не выключен
index_tv. - Создаёт алиасы для страниц, привязанных к активным наборам фильтров. Существующие алиасы не трогает. Фильтры типов
number,boolean,date,day,month,yearи числовые значения без подписи TV алиасов не получают. - Очищает кэш mFilter — вместе с прогретыми списками товаров: страницы остаются непрогретыми до ближайшего
mfl_warmup. - Перестраивает кэш роутера.
| Параметр | По умолчанию | Описание |
|---|---|---|
index_tv | true | Сначала проиндексировать значения TV |
resource_id | — | Создать алиасы только для одной страницы |
$mfilter->scheduleTaskOnce('mfl_reindex_slugs');Если индексация TV или генерация алиасов уже идёт, запуск встаёт в очередь на две минуты позже. Попыток до 60 — так же, как у пересборки индекса фасетов. В журнале — строка Slug reindex postponed, а когда попытки кончились — Slug reindex gave up.
mfl_generate_word_forms
Задача не работает
Задача ничего не сохраняет, и из админки её не запустить. Словоформы генерирует кнопка «Пакетная генерация» на вкладке Словоформы — без Scheduler.
mfl_rebuild_cache
Очищает файловый кэш mFilter и таблицу mfl_cache, кроме служебных записей, затем перестраивает кэш роутера и фильтров. Прогретые mfl_warmup списки товаров тоже стираются. Индекс фасетов (mfl_facet_index_*) задача не пересобирает — это делает mfl_rebuild_facet_index.
Повторяется: нет.
Когда запускается: mFilter сам эту задачу не ставит — только из Scheduler или из вашего кода. Кнопка «Пересобрать кэш» на вкладке «Наборы фильтров» — другое: она перестраивает привязки наборов к ресурсам.
| Параметр | По умолчанию | Описание |
|---|---|---|
clear_first | true | Очистить кэш перед перестройкой |
rebuild_router | true | Перестроить кэш роутера |
rebuild_filters | true | Перестроить кэш фильтров. Действует только вместе с clear_first |
$mfilter->scheduleTaskOnce('mfl_rebuild_cache', '+0 seconds', ['rebuild_router' => false]);Запуск из кода
Ставьте задачи в очередь через scheduleTaskOnce():
$mfilter = $modx->services->get('mfilter');
$runId = $mfilter->scheduleTaskOnce('mfl_rebuild_facet_index');| Аргумент | По умолчанию | Описание |
|---|---|---|
$reference | — | Имя задачи из списка |
$when | '+0 seconds' | Когда запустить — строка для strtotime() |
$data | [] | Параметры запуска |
Если запуск этой задачи уже ждёт в очереди, метод переносит его на новое время и передаёт новые параметры — второй запуск не появляется. Возвращает ID запуска или false, если Scheduler не установлен или задачи нет.
Не используйте $task->schedule()
Каждый вызов $task->schedule() добавляет отдельный запуск. У повторяющейся задачи такой запуск по завершении начинает вторую цепочку: задача выполняется вдвое чаще, пока лишнюю цепочку не удалят вручную.
Управление задачами
Где найти задачи
Пакеты → Планировщик → Задания, в поле поиска введите mfilter. Ждущие запуски — на вкладке «Предстоящие задания», завершённые — на вкладке «Прошедшие запуски».
Изменение интервала
Интервал повторяющейся задачи меняется в Scheduler — строкой для strtotime(): +30 minutes, +2 hours, +1 day. Новый интервал действует со следующего запуска: запуск, который уже стоит в очереди, сохраняет своё время.
Обновление mFilter вернёт интервал
При обновлении mFilter интервал и флажок «Циклическое» всех его задач возвращаются к исходным. После обновления проверьте их и поменяйте снова.
Только строки
Не пишите в интервал число. Scheduler передаёт его в strtotime(), и 3600 станет 3600 годом: время запуска выйдет за пределы, которые хранит база, и задача перестанет запускаться. Пишите +1 hour.
Отключение задачи
Снимите флажок «Циклическое» и удалите ждущий запуск задачи на вкладке «Предстоящие задания» — паузы у задач в Scheduler 1.9 нет. Удалять саму задачу бесполезно: обновление mFilter создаст её заново, а флажок «Циклическое» вернёт.
Задача перестала запускаться
Если запуск повторяющейся задачи завершился ошибкой, Scheduler не ставит следующий, пока выключена его настройка scheduler.recurring_on_failure. Найдите упавший запуск на вкладке «Прошедшие запуски», устраните причину и поставьте запуск через scheduleTaskOnce(). Цепочку восстанавливает и обновление mFilter.
После удаления mFilter
Задачи остаются в Scheduler — удалите их вручную.
