Magento的Cron有根本缺陷吗?


Is Magento's Cron fundamentally flawed?

我很难将 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 作业的了解,根据我的本地时区,这应该在下午 5 点运行。 但是,它永远不会起作用。 如果我改为将cron_expr设置为* 16 * * *它会在整个小时内每分钟安排一个作业(如您所料)。

追踪了代码,我想我发现了问题,但我对 cron 调度以及它真正应该如何工作还不够了解,所以我希望有人可以帮助我了解出了什么问题以及如何让我的工作工作。

Mage_Cron_Model_Schedule是野兽的大脑。 当服务器的 crontab 调度调用 cron.php 脚本时,它会调度此类捕获并执行其工作的事件。 除此之外,它还拉入配置并尝试安排即将到来的 cron 作业。 在public function trySchedule($time)内部,它调用 matchCronExpression ,将有问题的 cron 表达式的一部分以及与该 cron 表达式对应的当前时间值传递给它。 例如,它将cron_expr的第一部分(分钟部分)与当前时间戳的分钟进行比较。 在 matchCronExpression 函数结束时,它返回一个布尔值,如下所示:

return ($num>=$from) && ($num<=$to) && ($num%$mod===0);

就我而言,我的cron_expr0 16 * * *. 由于我的分钟部分没有任何范围或*/5类型的东西,因此它将我设置的确切值与当前时间戳的确切值进行比较。 这意味着只有当它碰巧在应该调度此作业的确切时刻运行 cron 脚本时,它才会返回 true。

同样,我不是 cron 专家,但这对我来说似乎不对。 那么,如果您无法预测 cron 调度程序将运行脚本的确切分钟数,那么应该如何安排作业每天运行一次? 我真的希望我错过了一些东西...谁能帮忙?

--

CRON 配置信息 --

generate schedules every: 5
schedule ahead for: 10
missed if not run within: 20
success history lifetime: 60
failure history lifetime: 600

我可能已经找到了这个问题的"解决方案",但我不确定这可能产生的影响。 希望其他人可以插话确认或提供更好的答案。

我在Magento中更改了我的Cron Config,如下所示:

generate schedules every: 1
schedule ahead for: 5
missed if not run within: 20
history cleanup every: 30
success history lifetime: 60
failure history lifetime: 600

这似乎已经成功了。 它现在每分钟生成一次时间表,因此它不会错过安排我每天一次的活动的窗口。

对此有什么想法吗? 我担心系统每分钟生成 cron 计划太多了。 它应该能够处理它,但我必须进行测试才能确认。

还有其他人有类似的经历吗? 你是怎么解决的?