Программный периодический крон в разное время

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

Аватар пользователя jsv jsv 19 апреля 2017 в 22:45

Можно настроить в админке запуск крона, это ок. А как быть, когда нужные функции нужно выполнять в разные интервалы, условно говоря задачу1 каждые 3 часа, а задачу2 каждый 17 часов? А сам крон зафиксирован на запуск каждые 24 часа в админке.

Как программно запускать такой крон? Или же это не через крон лучше решать?

Комментарии

Аватар пользователя Studio VIZA Studio VIZA 19 апреля 2017 в 22:58

https://www.drupal.org/project/elysia_cron

Установите тайминги и частоту каждой задачи хрон (вы можете запустить несколько заданий каждый день в указанный час, другие только раз в месяц и так далее ...). Для каждой задачи вы можете просто выбрать некоторые часто используемые опции ( «один раз в день», «раз в месяц» ...), или использовать мощный «Linux кронтаб» -like синтаксис , чтобы установить точные тайминги. Вы даже можете определить часто используемые опции для ускорения конфигурации сайта.

Аватар пользователя bumble bumble 20 апреля 2017 в 14:37
1

Крон должен запускаться с сервера (читать про cron), каждые n-времени (например, раз в час, или каждые 15 мин.), каждая задача реализуется отдельно в hook_cron, в нем же реализуется логика для проверки временного интервала (вполть до записи времени выполнения последней процедуры в БД).

То что в админке - лучше вообще отключить.

Аватар пользователя jsv jsv 20 апреля 2017 в 19:50

Как идёт проверка hook_cron ? Как заставить запускаться хуки эти по времени, иначе как в админке Друпала?

Аватар пользователя jsv jsv 20 апреля 2017 в 17:06

bumble wrote:

логика для проверки временного интервала (вплоть до записи времени выполнения последней процедуры в БД)

Вот про это вопрос. Как проверяют то такое? Есть примеры?

Аватар пользователя bumble bumble 20 апреля 2017 в 17:18
1

jsv wrote:

Как проверяют то такое?

Сравнивают данные.

jsv wrote:

Есть примеры?

<?php
if ((time() - $last_procedure_time) > $n) {}
else {}
?>
Аватар пользователя jsv jsv 20 апреля 2017 в 17:27

bumble wrote:
$last_procedure_time

Это фиксированная переменная, содержащая время последнего события? Или вы меня пытаетесь PHP учить?

Аватар пользователя bumble bumble 20 апреля 2017 в 17:30
1

"Это" пример.
$last_procedure_time - переменная для этого примера, что положите туда - то там и будет.
Тоже и про $n.

jsv wrote:

Или вы меня пытаетесь PHP учить?

Странный вопрос... Оставлю без ответа.

Аватар пользователя jsv jsv 20 апреля 2017 в 17:48

bumble wrote:

"Это" пример.

$last_procedure_time - переменная для этого примера, что положите туда - то там и будет.

То есть она сама заполняется и зависит от модуля? То есть в modulename_cron она присутствует по умолчанию и вашим кодом проверяется?
НО у меня тут два вызова - условно каждые 3 и 17 часов. Как такое проверить, если переменная одна?

Аватар пользователя bumble bumble 20 апреля 2017 в 17:55
1

jsv wrote:

То есть она сама заполняется и зависит от модуля?

Нет! То есть Вы сами заполняете ее данными, которые получаете применяя логику для Вашего случая.

Я изначально написал что можно записывать время в БД, соответственно при проверке эту запись получаем и с ней ровняем. После выполнения - данные в БД переписываем.

Аватар пользователя jsv jsv 20 апреля 2017 в 19:48

Да это понятно, как и что ручками можно. Я спрашивал, нет ли готовых решений - выясняем что нет, никто таких не знает, все вручную.

Аватар пользователя jsv jsv 20 апреля 2017 в 19:54

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

Аватар пользователя bsyomov bsyomov 20 апреля 2017 в 20:45

Зачем искать (ну или делать) какой-то готовый механизм, который должен будет учитывать 100500 случаев, и который заменяет 2-3-4 строки кода?
variable_set/variable_get позволяют сохранять/получать переменные. Как получать/сравнивать таймстампы, думаю не стоит объяснять?

Ваш хук крон вызывается, вы проверяете, прошло-ли нужное время с последнего запуска кода. Если нет, ничего не делаете, если да, записываете новый таймстамп и запускаете что-то. Всё. При этом логику можно сколь угодно усложнить, например, запускать только по чётным дням, или в пятницу тринадцатое. Smile И что, готовый механизм должен всё это уметь? Smile

Принципиально не буду тут писать PHP код. Имхо, просто пора учиться думать и программировать, а не искать готовые решения.