php - Magento 的 Cron 从根本上有缺陷吗?

标签 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 脚本时,它会分派(dispatch)此类捕获的事件并完成其工作。除其他外,它会引入配置并尝试安排即将到来的 cron 作业。在 public function trySchedule($time) 中,它调用 matchCronExpression,将相关的 cron 表达式片段以及与该片段对应的当前时间值传递给它cron 表达式。例如,它将 cron_expr 的第一部分(分钟 部分)与当前时间戳的分钟数进行比较。在 matchCronExpression 函数的末尾,它返回一个 bool 值,如下所示:

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

在我的例子中,我的 cron_expr0 16 * * *。由于我的 minutes 部分没有任何范围或 */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 配置,如下所示:

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 计划太多了。它应该能够处理它,但我必须进行测试才能确认。

有没有人有类似的经历?你是怎么解决的?

关于php - Magento 的 Cron 从根本上有缺陷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237446/

相关文章:

php - 将面包屑 php 添加到我的 Bootstrap 导航栏

php - 从mysql中的日期字符串中选择最早的日期

php - Magento 2 事件观察器不工作

magento - magento 的产品列表页面非常慢

node.js - 在 OS X 上通过 crontab 执行 Node.JS 脚本

php - 将库添加到 silex

php - cURL 给出无法解析主机

java - Solr:缺少内容流,Magento:重新索引时出错

php - 0 == * 计算结果为 true,0 === * 计算结果为 false

php - PHP yiic 命令的 Cron 作业