由于某种原因,这个代码在模块的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小时运行一次这个任务呢?
答案 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)