Мне трудно настроить задание Cron для запуска один раз в день в установленное время. Вот что у меня есть в конфигурации моего модуля:
<crontab>
<jobs>
<sorting_flushcache>
<schedule><cron_expr>0 16 * * *</cron_expr></schedule>
<run><model>sorting/observer::flushProductCacheCron</model></run>
</sorting_flushcache>
</jobs>
</crontab>
Из того, что я знаю о заданиях cron, они должны запускаться в 17:00 в зависимости от моего местного часового пояса. Однако это НИКОГДА не работает. Если я вместо этого установлю cron _expr на * 16 * * *
, он будет планировать задание каждую минуту в течение всего часа (, как и следовало ожидать ).
Я просмотрел код и думаю, что нашел проблему, но я недостаточно знаю о планировании cron и о том, как это на самом деле должно работать, поэтому я надеюсь, что кто-нибудь поможет мне понять, что неправильно и как заставить мою работу работать.
Маг _Крон _Модель _Расписание Мозги зверя. Когда скрипт cron.php вызывается расписанием crontab сервера, он отправляет событие, которое этот класс перехватывает и выполняет свою работу. Помимо прочего, он загружает конфигурацию и пытается запланировать предстоящие задания cron. Внутри public function trySchedule($time)
он вызывает matchCronExpression
, передавая ему часть рассматриваемого выражения cron вместе со значением текущего времени, соответствующим этой части выражения cron. Например, он сравнивает первую часть cron _expr(минут часть )с минутами текущей метки времени. В конце функции matchCronExpression
она возвращает логическое значение, подобное этому:
return ($num>=$from) && ($num<=$to) && ($num%$mod===0);
В моем случае мой cron _expr равен 0 16 * * *
. Поскольку у меня нет никаких диапазонов или типа */5
для моей части минут , я сравниваю точное значение, которое я установил, с точным значением текущей метки времени. Это означает, что он вернет true ТОЛЬКО в том случае, если скрипт cron запустился именно в ту минуту, когда это задание должно быть запланировано.
Опять же,Я не эксперт по cron, но мне это кажется неправильным. Как же тогда можно запланировать выполнение задания один раз в день, если вы не можете предсказать точную минуту, когда планировщик cron запустит сценарий? Я очень надеюсь, что я что-то упустил... может кто-нибудь помочь?
--CRON CONFIG INFO--
generate schedules every: 5
schedule ahead for: 10
missed if not run within: 20
success history lifetime: 60
failure history lifetime: 600