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秒执行一个子任务。
使用场景
- 订单超时取消
- 支付状态刷新等
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
是自定义的进程类名,在初始化这个进程中,参数传递有两种方式
- 像上文中例子中那样,直接传参,第一个参数是进程名称,第二是参数是实际要传递的参数,一般为数组
- new 一个
EasySwoole\Component\Process\Config
,给它setProcessName
setArg
后直接传递给进程。
自定义进程只初始化一次,如果要执行周期性的任务,可在其中使用Timer
定时。
以上就是EasySwoole进阶之Timer、Task、Crontab、Process,可根据自己的项目需求组合使用。