Является ли Magento и #39;s Cron фундаментально ошибочным?

Мне трудно настроить задание 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
5
задан BrianVPS 20 April 2012 в 05:01
поделиться