请教大佬们,crontab动态操作方法

a361690548

问题描述

请教大佬们,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();
        });
    }
}
289 4 0
4个回答

tanhongbin

定时器 定时查表 然后把新的 或者未执行的 重新执行呗 但是crontab 不知道怎么删除

  • tanhongbin 9天前

    或者定时查表 有变化 重启crontab这个进程也是可以的

  • a361690548 9天前

    我现在就是基于定时器弄得

不败少龙

看看有没有参考价值(Controller里面写的)

                //查询表中cron
                $info = $this->model->where('id',$id)->select(['id',"cron",'product_ids'])->first();
                $task_id = $info->id;
                $old_cron = $info->cron;
                //新的cron与旧cron比较
                if (empty($cron) || $cron == $old_cron){
                    $cron = $old_cron;
                }
                if($cron != $old_cron){
                    $cron_data_task = new Crontab($old_cron,function ()use(&$cron_data_task){
                        $cron_data_task->destroy();
                    });
                }
                $product_ids = $info->product_ids;
                $cron_data = new Crontab($cron, function () use (&$cron_data,$product_ids, $task_id,$status,$cron) {
                    $new_cron = IotThingsEventSource::query()->where('id',$task_id)->value('cron');
                    $old_cron = $cron_data->getRule();
                    if ($status==0 || $online_status==0 || $new_cron!=$old_cron){
                        $cron_data->destroy();
                    }else{
                        //执行业务逻辑
                    }
                });
小Z先生

直接把这个项目拉下来看 https://www.workerman.net/plugin/42
看懂了你就懂了

  • a361690548 6天前

    之前大概看过,明天我在细看一遍

  • tanhongbin 6天前

    crontab这个 能不能删除呢 如果能 其实很好实现

我是老6

删除只能靠gc了,如果类没有引用会被回收掉吧,如果说暂停定时器是可以实现的,在类属性中指定属性,去判断属性就好了,像下面这种
截图

  • tanhongbin 2天前

    有删除crontab的方法 new crontab得到的对象 调用这个方法 destroy() 就可以删除了,但是下一分钟生效

×
🔝