请教大佬们,crontab动态操作更好的方法
我现在是基于Timer实现的,不知道各位有啥好的方法推荐
下面是我的代码
<?php
namespace app\process;
use app\admin\logic\system\SystemCrontabLogic;
use Workerman\Crontab\Crontab;
use Workerman\Timer;
class Task
{
protected $crontab=[];
public function onWorkerStart($worker)
{
$this->init();
$this->heartBeat();
}
public function init()
{
$logic = new SystemCrontabLogic();
$taskList = $logic->where('status', 1)->select();
$allTaskKeys =[];
foreach ($taskList as $task){
if(!isset($this->crontab[$task->id])){
$crontab = new Crontab($task->rule, function () use ($logic, $task) {
$logic->run($task->id);
},$task->name);
$this->crontab[$task->id] = $crontab;
}
$allTaskKeys[$task->id] = $task->id;
}
$tasks = array_keys($allTaskKeys);
foreach ($this->crontab as $key=>$task) {
if (!in_array($key, $tasks)) { //已经从数据库删除
$crontab = $this->crontab[$key];
$crontab->remove($task->getId());
unset($this->crontab[$key]);
}
}
}
public function run($args)
{
$list = Crontab::getAll();
foreach ($list as $item){
var_dump('任务ID=>'.$item->getId().'任务名称=>'.$item->getName());
}
echo '任务调用:'.date('Y-m-d H:i:s')."\n";
// var_dump('参数:'. $args);
}
private function heartBeat()
{
Timer::add(60, function () {
echo '心跳检测:'.date('Y-m-d H:i:s')."\n";
$this->init();
});
}
}
定时器 定时查表 然后把新的 或者未执行的 重新执行呗 但是crontab 不知道怎么删除
或者定时查表 有变化 重启crontab这个进程也是可以的
我现在就是基于定时器弄得
看看有没有参考价值(Controller里面写的)
好的 我研究研究这种方法
直接把这个项目拉下来看
https://www.workerman.net/plugin/42
看懂了你就懂了
之前大概看过,明天我在细看一遍
crontab这个 能不能删除呢 如果能 其实很好实现
删除只能靠gc了,如果类没有引用会被回收掉吧,如果说暂停定时器是可以实现的,在类属性中指定属性,去判断属性就好了,像下面这种
有删除crontab的方法 new crontab得到的对象 调用这个方法 destroy() 就可以删除了,但是下一分钟生效