Magento:每2小时设置一次cronjob

时间:2011-09-09 14:55:23

标签: php magento

由于某种原因,这个代码在模块的config.xml中:

<jobs>
    <stockupdate>
       <schedule><cron_expr>0 */2 * * *</cron_expr></schedule>
        <run><model>stockupdate/cron::start</model></run>
    </stockupdate>
</jobs>

不起作用。虽然将*/2更改为*后似乎一切正常。

要测试它,我首先执行TRUNCATE cron_schedule,然后清理缓存rm -rf var/cache,然后运行php cron.php,然后运行SELECT * FROM cron_schedule以查看作业是否已安排。

我知道还有令人讨厌的方式0 0,2,4,6,8,10,12,14,16,18,20,22 0 0 0,但这是一个非常不优雅的解决方案。

那么我怎么能告诉Magento每2小时运行一次这个任务呢?

4 个答案:

答案 0 :(得分:1)

您可以使用

<schedule><cron_expr>0 * * * *</cron_expr></schedule>

并让您的代码检查甚至数小时。不优雅,但它会起作用。如果需要配置,您可以添加一个配置选项来控制它在几小时内运行的频率。

<强>更新

Mage_Cron_Model_Schedule方法中查看matchCronExpression

    // handle modulus
    if (strpos($expr,'/')!==false) {
        $e = explode('/', $expr);
        if (sizeof($e)!==2) {
            throw Mage::exception('Mage_Cron', "Invalid cron expression, expecting 'match/modulus': ".$expr);
        }
        if (!is_numeric($e[1])) {
            throw Mage::exception('Mage_Cron', "Invalid cron expression, expecting numeric modulus: ".$expr);
        }
        $expr = $e[0];
        $mod = $e[1];
    } else {
        $mod = 1;
    }

    // handle all match by modulus
    if ($expr==='*') {
        $from = 0;
        $to = 60;
    }
    // handle range
    elseif (strpos($expr,'-')!==false) {
        $e = explode('-', $expr);
        if (sizeof($e)!==2) {
            throw Mage::exception('Mage_Cron', "Invalid cron expression, expecting 'from-to' structure: ".$expr);
        }

        $from = $this->getNumeric($e[0]);
        $to = $this->getNumeric($e[1]);
    }
    // handle regular token
    else {
        $from = $this->getNumeric($expr);
        $to = $from;
    }

    if ($from===false || $to===false) {
        throw Mage::exception('Mage_Cron', "Invalid cron expression: ".$expr);
    }

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

设置正确处理* / 2。

答案 1 :(得分:1)

每2小时使用表达式

<schedule><cron_expr>0 */2 * * *</cron_expr></schedule>

如果你设置

<schedule><cron_expr>* */2 * * *</cron_expr></schedule>
你会得到的,那个任务将每隔一小时每分钟进行一次。第二小时60个任务,3d小时0个任务,4小时60个任务等。

答案 2 :(得分:0)

尝试将cron任务设置为* * / 02

答案 3 :(得分:0)

如果您希望每2个小时一次,则表达式为:

<schedule>00 */2 * * *</schedule>

这将在每2小时的第0分钟执行。

Check for more expressions