Выполнение скриптов по Cron на сайте

14 июня 2019 в 10:01
Аватар пользователя 7Rei 7Rei 0 8 Решено

Добрый день!
Есть 5 разных drupal скриптов, которые нужно запускать с разной периодичностью (какие-то каждый час, какие-то раз в месяц). Сейчас скрипты добавлены в Rules с триггером по запуску Cron. За выполнение и запуск крона отвечает модуль: Ultimate Cron. Модуль хороший, но он не позволяет разделять запуски Rules (так чтобы у каждого скрипта было свое время запуска).

Вопросы:
Каким модулем можно разделять запуски скриптов Rules с триггером по Cron?
Возможно, вместо размещения скриптов в Rules и запуска их от туда, есть более совершенная схема размещения и исполнения периодически запускаемых скриптов на сайте?

Спасибо.

Комментарии

какие-то каждый час, какие-то раз в месяц

Проще для этих целей заюзать серверный крон и, возможно, кастомные скрипты для запуска правил rules (а может в таком случае и rules будут не нужны)

14 июня 2019 в 10:04

Чтобы ultimate cron подхватил ваши разные скрипты, они должны выполняться из разных hook_cron(), т.е. вам нужны 5 кастомных модулей.

Вы можете вынести логику в отдельные файлы и запускать их серверным кроном с нужной периодичностью, это будет заведомо лучше, так как при запуске через cli - и выполнение выходит быстрее и лимиты отдельные

14 июня 2019 в 10:08

В том же рулзе, можно проверять текущее время/дату.
Если вариантов написать программно логику периодов возможности нет, можно завязываться на эти показатели.
Если нужно еще более точно - можно наколхозить с сущностями, в которые записывать отметки последних запусков для каждого типа таска, и учитывать эти данные в проверках (правильнее, конечно, хранить такие данные в других местах, но не уверен что текущая инфраструктура правил позволяет такое).
И да, крон должен запускаться с сервера.

14 июня 2019 в 14:38

Не использовал ультимат, так как иллюзия покрывала потребности, из Вашего текста понял что все у Вас идут через рулесный крон, и тот код который Вы нашли должен помочь в решении. Однако на практике чаще сталкиваюсь и решаю проблемы которые связаны не с временем запуска крон задач, а с разделением ресурсов для из выполнения и распределением нагрузки на сервер, а это часто решается выполнением крона через batch с progressive = false в фоновом режиме без интерактива. Вопросы времени остаются только для целевых задач где важна временная точка запуска.

15 июня 2019 в 18:07

Добрый вечер всем! Спасибо за ответы!! Пока нашел такое решение:

1. Создаём Rule с реакцией на Cron maintenance tasks are performed.
2. Добавляем условие Execute custom PHP code с кодом:

<?phpif (REQUEST_TIME - variable_get('my_rule_name_last_run') >= 60*60*6) {
  variable_set('my_rule_name_last_run', REQUEST_TIME);
  return TRUE;
}?>

Правило будет выполнено через 6 часов в ближайший запуск крона.
3. Далее запуск модульного крона (у Rules) должен быть чаще 6 часов.

Источник: http://xandeadx.ru/blog/drupal/705

ПС. (Ещё не оттестировал, но похоже вариант рабочий)

14 июня 2019 в 22:03