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

时间:2012-04-19 21:58:53

标签: php magento cron crontab 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>

根据我对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_expr 0 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

1 个答案:

答案 0 :(得分:3)

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

我在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时间表太多了。它应该能够处理它,但我必须做测试以确认。

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