有时调用cron两次或三次

时间:2013-04-13 22:26:43

标签: php cron

我不得不做类似“cron Job”的事情,因为我无法访问cPanel

我对这个cron Job课程的逻辑是当有人从网站点击某些内容,验证时间并致电课程时。

...所以....

这是我的cronJob类,我的问题是有时它会将类调用两次或三次 ..(可能来自两个或更多用户的当前时间是相同的..

<?php
class cronJob extends Core {
    public function execute() {
        include("interfaces/cronJob.php");
        $items = $this->query("SELECT `id`, `class`, `interval`, `time` FROM `cron_job`");
        while($item = $this->fetch($items))
        {
            if($this->getTime() > $item['time']) {
                $this->query("UPDATE `cron_job` SET `time` = '".($this->getTime() + $item['interval'])."' WHERE `id` = '".$item['id']."'");
                $this->getLog("cronJob: ".$this->getTime()." Class: ".$item['class']);

                include_once("cron/".$item['class'].".php");
                $job = new $item['class'];
                $job->run();
            } 
        }
    }
}
?>

......和......这是时间函数(我认为没必要:P)

public function getTime() {
    return time() + 305;
}

日志:

2013-04-14 12:59:02 - cronJob: 1365890342 Class: updateFiles
2013-04-14 12:59:37 - cronJob: 1365890377 Class: updateTrivia
2013-04-14 01:00:13 - cronJob: 1365890413 Class: updateTrivia
2013-04-14 01:00:49 - cronJob: 1365890449 Class: updateTrivia
2013-04-14 01:01:25 - cronJob: 1365890485 Class: updateTrivia
2013-04-14 01:02:01 - cronJob: 1365890521 Class: updateTrivia
2013-04-14 01:02:37 - cronJob: 1365890557 Class: updateTrivia
2013-04-14 01:03:13 - cronJob: 1365890593 Class: updateTrivia
2013-04-14 01:03:49 - cronJob: 1365890629 Class: updateTrivia
2013-04-14 01:04:25 - cronJob: 1365890665 Class: updateTrivia
2013-04-14 **01:05:01** - cronJob: 1365890701 Class: updateTrivia
2013-04-14 **01:05:01** - cronJob: 1365890701 Class: updateTrivia

表:

enter image description here

所以...有没有人有任何想法来解决它?

2 个答案:

答案 0 :(得分:0)

您可以尝试:

  • 使用数据库阻止它:例如,锁定表/启动事务(小心,选项在MyISAM引擎上不可用)。
  • 从文件中写入和读取。如果文件的内容!=“x”,则跳过更新。

答案 1 :(得分:0)

您需要的功能通常称为exclusive lock

Another question on SO可能会为您提供一些如何在您的案例中实施锁定的灵感 请注意,提到的APC功能是大多数标准发行版未附带的可选PHP模块(并且不存在于许多Web主机上)