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

Scheduler-задачи

mFilter регистрирует семь задач в Scheduler при установке/обновлении. Большинство выполняется по расписанию автоматически — вмешательство админа не требуется. Несколько — on-demand, запускаются по нажатию кнопки в админке или вызываются программно.

Подсказка

Scheduler — опциональная зависимость. Без него mFilter работает, но отсутствуют:

  • Фоновая пересборка индекса фасетов (нужно нажимать «Пересобрать сейчас» и ждать)
  • Автопрогрев кэша baseIds
  • Ежедневная регенерация sitemap
  • Автоочистка mfl_request_ids

Полный список задач

ReferenceRecurringИнтервалНазначение
mfl_sync_facet_indexда+5 минутИнкрементальный sync индекса фасетов по editedon
mfl_rebuild_facet_indexнетПолная пересборка индекса фасетов
mfl_warmupда+50 минутПрогрев baseIds для AJAX (legacy)
mfl_generate_sitemapда+1 деньГенерация XML sitemap
mfl_cleanup_request_idsда+10 минутОчистка stale-строк mfl_request_ids
mfl_reindex_slugsнетПересоздание SEO-алиасов значений
mfl_generate_word_formsнетГенерация словоформ для SEO
mfl_rebuild_cacheнетПерестройка кэша роутера и фильтров

mfl_sync_facet_index

С версии 1.4.1. Инкрементальный sync индекса фасетов: находит товары, которые изменились с момента последнего запуска (editedon > last_sync_at), и пересобирает индекс точечно для них.

Recurring: да, +5 minutes.

Что закрывает:

  • Прямые $resource->save() без процессора (плагин не получает OnDocFormSave, sync догоняет за 5 минут)
  • Импорты, которые пишут в msProductData напрямую через INSERT/UPDATE с editedon=NOW()
  • TV-правки через программный API

Что НЕ закрывает:

  • Прямой SQL без обновления editedon
  • DELETE FROM modx_site_content (нет editedon у удалённых строк)
  • Для этих случаев — ручной запуск mfl_rebuild_facet_index или восстановление через editedon=NOW() в импортёре

Стоимость: на простаивающем сайте — миллисекунды (нет работы, лог пустой). На активном — пересобирает только дельту, обычно десятки/сотни товаров батчами по 5000 ID.

Состояние хранится в mfl_cache под ключом facet_index.last_sync_at (UNIX timestamp). При первом запуске задача не пытается пересобирать весь каталог — просто фиксирует текущее время как baseline.

php
// Ручной вызов (если нужно вне расписания)
$mfilter->getFacetIndexBuilder()->syncByEditedon();
// ['synced' => N, 'removed' => N, 'until' => ts, 'chunks' => N, 'duration_ms' => N]

Подробнее про сценарии и паттерны: Cookbook: Синхронизация индекса фасетов.

mfl_rebuild_facet_index

С версии 1.4.0. Полная пересборка таблиц mfl_facet_index_text и mfl_facet_index_num из источников (msProductData, msProductOption, modTemplateVarResource, modResource).

Recurring: нет.

Когда запускается:

  • Автоматически в очередь Scheduler при upgrade пакета (бесшовная миграция)
  • Вручную по кнопке «Через Scheduler» на вкладке Обслуживание
  • Программно из любого кода

Когда нужно вручную:

  • После массового импорта товаров
  • После прямых SQL-правок в msProductData / msProductOption
  • При расхождениях между фильтрами и реальными товарами

Длительность: на каталоге 30k — 5–10 секунд, на 200k — до 2 минут.

php
$scheduler = $modx->services->get('scheduler');
$task = $scheduler->getTask('mfilter', 'mfl_rebuild_facet_index');
$task->schedule('+0 seconds');

Sanity rebuild

Можно включить recurring (например, еженедельно) через UI Scheduler как страховку от расхождений данных. По умолчанию не включён — обычно достаточно автоматических триггеров.

Подробнее: Обслуживание → Индекс фасетов.

mfl_warmup

Legacy с версии 1.4.0

С появлением индекса фасетов большая часть прогрева больше не нужна — значения и suggestion'ы теперь читаются из индекса. Задача оставлена для прогрева baseIds в AJAX-режиме. После стабилизации индекса будет упрощена или удалена.

Прогревает baseIds для всех активных конфигураций прогрева.

Recurring: да, +50 minutes (с запасом 10 минут до стандартного TTL кэша 3600 секунд).

Параметры:

ПараметрПо умолчаниюОписание
warm_suggestionstrueПрогревать также фасетные счётчики (legacy путь)
php
$warmupManager = $mfilter->getWarmupManager();
$runId = $warmupManager->schedule(true);

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

mfl_generate_sitemap

Генерация XML-карты сайта с фильтрованными страницами.

Recurring: да, +1 day.

Когда запускается: ежесуточно (актуальный sitemap для поисковых ботов).

Что делает: обходит все активные FilterSet, генерирует URL для популярных комбинаций фильтров, сохраняет XML в файл (в отличие от сниппета, который отдаёт XML в HTTP-ответе).

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

Изменяются прямо в файле core/components/mfilter/elements/tasks/generateSitemap.php (раздел // DEFAULT PARAMETERS):

ПараметрПо умолчаниюОписание
filenamesitemap-filters.xmlИмя выходного файла (создаётся в корне сайта)
parents''Ограничение по родительским ресурсам
filterKeys''Список ключей фильтров
maxFilters1Максимум фильтров в одном URL
priority0.7Приоритет URL в sitemap
changefreqweeklyЧастота обновления
php
$scheduler = $modx->services->get('scheduler');
$task = $scheduler->getTask('mfilter', 'mfl_generate_sitemap');
$task->schedule('+0 seconds');

Подробнее про параметры самого сниппета: mFilterSitemap.

mfl_cleanup_request_ids

С версии 1.4.0. Удаляет старые строки из mfl_request_ids (см. RequestIdsRegistry) — это страховка на случай fatal-ошибок PHP, когда деструктор не успел отработать.

Recurring: да, +10 minutes.

Когда запускается: каждые 10 минут.

Что делает:

  1. Считает строки старше TTL (по умолчанию 30 минут)
  2. Удаляет их пачкой
  3. Логирует количество удалённых строк, если > 0

В нормальной работе строки удаляются деструктором RequestIdsRegistry сразу по окончании запроса. Cron-задача срабатывает только если был kill -9, segfault или другой нештатный обрыв процесса.

Подсказка

Если задача регулярно удаляет много строк — это сигнал о нестабильности PHP-процесса. Проверьте логи MODX и системный journal.

mfl_reindex_slugs

Пересоздаёт SEO-алиасы (slugs) для всех значений фильтров.

Recurring: нет.

Когда запускается:

  • Вручную по кнопке «Переиндексация» в шапке админки
  • Через Scheduler-UI после изменения правил транслитерации

Что делает:

  1. Обходит все значения фильтров во всех активных FilterSet
  2. Для каждого создаёт slug, если его ещё нет
  3. Не удаляет существующие — только добавляет недостающие
php
$scheduler = $modx->services->get('scheduler');
$task = $scheduler->getTask('mfilter', 'mfl_reindex_slugs');
$task->schedule('+0 seconds');

mfl_generate_word_forms

Генерация словоформ для SEO-текстов через morpher.ru API.

Recurring: нет.

Когда запускается: вручную по кнопке на вкладке «Словоформы», когда пользователь добавляет новые слова или меняет правила склонения.

Что делает:

  1. Обходит таблицу mfl_word_forms, ищет слова без склонений
  2. Запрашивает morpher.ru API
  3. Сохраняет полученные формы

Внимание

Требует доступа к интернету и (опционально) API-ключа morpher.ru. Без ключа есть лимит на запросы.

Подробнее: Словоформы.

mfl_rebuild_cache

Очищает и заново строит кэш роутера и фильтров.

Recurring: нет.

Когда запускается:

  • Вручную после изменения паттернов URL или привязок наборов
  • Программно при изменении конфигурации

Параметры:

ПараметрПо умолчаниюОписание
clear_firsttrueОчистить кэш перед перестройкой
rebuild_routertrueПерестроить кэш роутера
rebuild_filterstrueПерестроить кэш фильтров
php
$mfilter = $modx->services->get('mfilter');
$taskId = $mfilter->scheduleCacheRebuild();

Подсказка

Не путать с индексом фасетов. Эта задача про MflCache (промежуточные результаты), индекс фасетов (mfl_facet_index_*) пересобирается отдельно через mfl_rebuild_facet_index.

Управление задачами

Просмотр задач

Если установлен Scheduler, перейдите в Установщик → Scheduler → Tasks, отфильтруйте по namespace mfilter.

Изменение интервалов

Можно изменить интервал recurring-задач через UI Scheduler:

ПолеФорматПример
intervalстрока для strtotime()+30 minutes, +2 hours, +1 day

Внимание

Не используйте числовые значения для interval (например 1800). Scheduler передаёт это в strtotime(), который трактует число как год — 1800 станет 1800 годом, что переполнит INT(11) в колонке nextrun и зафиксирует таску на 2038-01-19. Только относительные строки.

Отключение задачи

Поставьте задачу на паузу через UI Scheduler. Удалять не рекомендуется — при upgrade пакета она будет перезарегистрирована.

Что произойдёт без Scheduler

ЗадачаПоведение без Scheduler
mfl_sync_facet_indexНе работает. Прямые $resource->save() и SQL-импорты не отражаются в индексе автоматически — нужен ручной rebuild
mfl_rebuild_facet_indexСборка через UI кнопку «Пересобрать сейчас» (синхронно)
mfl_warmupAJAX-режим без прогрева кэша → первый запрос дольше
mfl_generate_sitemapSitemap не обновляется автоматически
mfl_cleanup_request_idsStale-строки накапливаются; устраняется при следующем перезапуске PHP-FPM
ОстальныеЗапускаются вручную из кода или UI mFilter