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

Главные вкладки

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

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

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

Спасибо.

Лучший ответ

Аватар пользователя ivnish ivnish 14 июня 2019 в 10:04
1

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

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

Комментарии

Аватар пользователя ivnish ivnish 14 июня 2019 в 10:04
1

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

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

Аватар пользователя Semantics Semantics 14 июня 2019 в 10:08
1

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

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

Аватар пользователя bumble bumble 14 июня 2019 в 14:38
1

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

Аватар пользователя sas@drupal.org sas@drupal.org 15 июня 2019 в 18:07
1

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

Аватар пользователя 7Rei 7Rei 14 июня 2019 в 22:03

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

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

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