Magento的Cron是否存在根本缺陷?

Bri*_*VPS 5 php cron crontab magento magento-1.5

我很难设置一个Cron工作,在设定的时间每天运行一次.这是我在模块配置中的内容:

<crontab>
    <jobs>
        <sorting_flushcache>
            <schedule><cron_expr>0 16 * * *</cron_expr></schedule>
            <run><model>sorting/observer::flushProductCacheCron</model></run>
        </sorting_flushcache>
    </jobs>
</crontab>
Run Code Online (Sandbox Code Playgroud)

根据我对cron作业的了解,这应该在我当地时区的下午5点开始.但是,它永远不会奏效.如果我改为将cron_expr设置为* 16 * * *它,则会在整个小时内每分钟安排一个作业(正如您所期望的那样).

我通过代码追踪,我想我找到了问题,但我不知道有足够的了解cron的调度,以及如何这是真的要工作,所以我希望有人能帮助我了解了什么问题以及如何使我的工作的工作.

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

return ($num>=$from) && ($num<=$to) && ($num%$mod===0);
Run Code Online (Sandbox Code Playgroud)

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

同样,我不是专家,但这对我来说似乎不对.那么,如果你无法预测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
Run Code Online (Sandbox Code Playgroud)

Bri*_*VPS 3

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

我在 Magento 中更改了 Cron 配置,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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