Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  • MODX 3
  • PHP 8.1
  • Vue 3
  1. Компоненты
  2. mFilter
  3. Интерфейс админки
  4. Scheduler-задачи

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. Пока идёт полная пересборка, синхронизация пропускается до следующего запуска.

php
// Запуск вне расписания
$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_suggestionstrueПрогревать и счётчики значений
php
$runId = $mfilter->getWarmupManager()->schedule(true);

Подробнее: Прогрев кэша.

mfl_generate_sitemap ​

Обходит страницы с наборами фильтров, собирает адреса одиночных фильтров (при maxFilters = 2 — и пар) и сохраняет XML в файл.

Повторяется: каждый день.

Карта задачи отличается от карты сниппета:

  • сниппет отдаёт XML в ответе на запрос, а не в файл;
  • в карту задачи попадают значения без товаров в разделе;
  • пары собираются из всех сочетаний;
  • адреса начинаются с http:// — задача работает из консоли.

Подробнее — на странице mFilterSitemap.

Параметры задачи ​

ПараметрПо умолчаниюОписание
filenamesitemap-filters.xmlИмя файла в корне сайта
parents''ID страниц с наборами фильтров; пусто — все
filterKeys''Ключи фильтров через запятую
maxFilters11 — только одиночные фильтры, 2 — и пары
priority0.7Приоритет адреса в карте
changefreqweeklyЧастота обновления

Свои значения передавайте данными запуска, а не правкой файла core/components/mfilter/elements/tasks/generateSitemap.php. В нём заданы значения по умолчанию, и правка пропадёт при обновлении пакета.

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.

Что делает:

  1. Индексирует значения TV, если не выключен index_tv.
  2. Создаёт алиасы для страниц, привязанных к активным наборам фильтров. Существующие алиасы не трогает. Фильтры типов number, boolean, date, day, month, year и числовые значения без подписи TV алиасов не получают.
  3. Очищает кэш mFilter — вместе с прогретыми списками товаров: страницы остаются непрогретыми до ближайшего mfl_warmup.
  4. Перестраивает кэш роутера.
ПараметрПо умолчаниюОписание
index_tvtrueСначала проиндексировать значения TV
resource_id—Создать алиасы только для одной страницы
php
$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_firsttrueОчистить кэш перед перестройкой
rebuild_routertrueПерестроить кэш роутера
rebuild_filterstrueПерестроить кэш фильтров. Действует только вместе с clear_first
php
$mfilter->scheduleTaskOnce('mfl_rebuild_cache', '+0 seconds', ['rebuild_router' => false]);

Запуск из кода ​

Ставьте задачи в очередь через scheduleTaskOnce():

php
$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 — удалите их вручную.