定时拉取数据库数据从而更新创建新的定时任务

18829520602

bug描述

这里写描述
我通过Timer::add定时拉取数据库数据然后创建新的定时任务new Crontab最后发现创建了很多重复的定时任务

程序代码或配置

Timer::add(1, function() use ($mqtt) {
$res = Db::table("smart_timeTask")->select();

/这里省略了部分无关的代码/
for ($a=0; $a < count($weekend); $a++) {

new Crontab("$time[1] $time[0] $weekend[$a]", function() use ($mqtt,$command){
$mqtt->publish('DO',$this->str2hex($this->$command),array("qos"=>2));
echo $this->$command."\n";
});
}

})
//通过$res的结果集数据循环创建定时任务

期待的结果及实际结果

这里写期待结果及实际结果
我希望数据库的数据有更新同时,之前创建的定时任务也会更新----而且定时轮询数据库中的数据,从而实现更新定时任务、不创建重复的定时任务

系统环境及workerman/webman等具体版本

这里写具体的系统环境相关信息
centos7 php7.4 workerman最细版本

749 2 0
2个回答

liziyu

mark

oliusha

可以先调用接口:Crontab::destroy()销毁定时器,再重装创建。

  • 18829520602 2022-10-31

    试过,但是容易错过刚创建的定时器。比如一次循环结束就销毁,如果下一秒刚好是之前创建的定时任务就会错过

  • oliusha 2022-10-31

    创建一个任务池,在循环的时候,先判断池里有没有这个任务,有就先销毁,再创建,没有就直接创建。不是循环创建任务后就直接销毁。

  • 18829520602 2022-10-31

    怎么搞任务池可以发一下示例代码吗

  • oliusha 2022-10-31

    可以用一个数组来储存创建的任务

  • 18829520602 2022-10-31

    你说的这个我之前试过,可以怎么区分判断定时任务呢,总得有个标记吧

年代过于久远,无法发表回答
🔝