EasySwoole进阶之Timer、Task、Crontab、Process

EasySwoole的进阶用法中有Timer、Task、Crontab、Process。

Timer

也就是定时器,在EasySwooleEvent.php中的mainServerCreate中注册

$register->add(EventRegister::onWorkerStart, function (\swoole_server $server, $workerId) {
    //在第一个进程 添加一个10秒的定时器
    if ($workerId == 0) {
        \EasySwoole\Component\Timer::getInstance()->loop(10 * 1000, function () {
            //2秒后一个任务
            \EasySwoole\Component\Timer::getInstance()->after(2 * 1000, function () {
                //为了防止因为任务阻塞,引起定时器不准确,把任务给异步进程处理
                Logger::getInstance()->console("time 2", false);
            });
        });
    }
});

此定时器为每10秒执行一次,在内部又过2秒执行一个子任务。

使用场景

  1. 订单超时取消
  2. 支付状态刷新等

Task

Task有异步和同步两种用法,其中同步任务可返回数据。

例:

$task = TaskManager::getInstance();
$task->async(function (){
    echo "异步调用task1\n";
});
//$data =  $task->sync(new TaskTplOne(19));
$data = $task->sync(function(){
    $user_lib = new \App\Library\User();
    return $user_lib->userInfoById(19);
});

$this->response()->write(json_encode($data));

同步任务返回数据,可直接在闭包函数中写代码返回数据,也可以使用官方推荐的方法,使用任务模板,效果是一样的,注释掉的部分即为任务模板。前者相对灵活,后者解耦性好。

经测试,使用同步任务,不如直接调用来得快,效率打了个折扣。

Crontab

计划任务,有了它就不需要再用crontab -e配置定时任务了,倒是方便了不少。

同定时器一样,需要在EasySwooleEvent.php中的mainServerCreate方法中注册。

Process

自定义进程,同样需要在EasySwooleEvent.php中的mainServerCreate方法中注册。

例:

ServerManager::getInstance()->getSwooleServer()->addProcess((new Trade('Trade', ['id' => 1, 'other' => 2]))->getProcess());

其中Trade是自定义的进程类名,在初始化这个进程中,参数传递有两种方式

  1. 像上文中例子中那样,直接传参,第一个参数是进程名称,第二是参数是实际要传递的参数,一般为数组
  2. new 一个 EasySwoole\Component\Process\Config,给它setProcessName setArg后直接传递给进程。

自定义进程只初始化一次,如果要执行周期性的任务,可在其中使用Timer定时。

以上就是EasySwoole进阶之Timer、Task、Crontab、Process,可根据自己的项目需求组合使用。

Leave a Comment

豫ICP备19001387号-1