Yii2队列的简单使用
高性能离不开异步,异步离不开队列。
下面将介绍Yii2框架怎么使用队列进行一些异步处理。
在系统很多模块可能同步处理需要很长时间,比如发送邮件、视频转码、日志存储等。
假如系统处理这些功能模块都是使用同步处理的话,那么系统性能必将大大降低。
所以我们可以考虑异步进行处理这些长进程任务。
下面将介绍Yii2的队列,即可以实现异步处理这些任务。
关于队列入门知识可以参考《redis消息队列简单应用》
概括
-
- 安装yiisoft/yii2-queue
-
- 配置
-
- 创建队列任务类
-
- 控制器将数据添加到队列中
-
- 启动/监听队列
-
- 使用Supervisor将队列任务启动 添加到守护进程中
1. 安装yiisoft/yii2-queue
直接使用 composer 命令:
composer require yiisoft/yii2-queue
有关composer,可以参考《composer的安装 及 常用命令(切换源等)》
2. 配置
需要在main.php 配置
也要到console.php配置(主要为了开启command命令)
console.php配置注意!!!
务必在bootstrap节点下增加queue,否则 command命令是没有queueu的
bootstrap 节点一定要添加queue哦,否则执行 php yii queue/* 命令时,会报错,说command unknown
'bootstrap' => ['log','queue'],
基础配置如下:
'redis' => ['class' => 'yii\redis\Connection','hostname' => '192.168.30.80','port' => 6379,'database' => 2,],'queue' => ['class' => 'yii\queue\redis\Queue','redis' => 'redis','channel' => 'queue',],
3. 创建队列任务类
<?phpnamespace app\jobs;use yii;use yii\base\BaseObject;use yii\queue\RetryableJobInterface;class ImportUserJob extends BaseObject implements RetryableJobInterface{public $data;public function __construct($data){$this->data = $data;return $this;}//处理单个任务的最大时间public function getTtr(){return 2;}//任务超时(超过getTtr配置的时间), 重复 加入队列 的次数 $attemptpublic function canRetry($attempt, $error){return ($attempt < 3) && ($error);}//执行队列public function execute($queue){$data = $this->data;date_default_timezone_set('PRC');Yii::$app->mailer->compose('layouts/login', ['dateTime' => date('Y-m-d H:i:s'),'h2' => $data['name'],'h3' => $data['id'],'pushDate' => $data['pushDate'],'code' => 0,'msg' => 'OK'])->setTo('123456789@qq.com')->setSubject('发送用户请求信息')->send();}}
//以上配置,2秒执行一个任务,要是没有执行完,那么将重复加入队列中执行(3次),这样会重复执行多次任务
4. 控制器将数据添加到队列中
//入队操作$data = [['id' => 1, 'pushDate' => '', 'name' => '小一'],['id' => 2, 'pushDate' => '', 'name' => '赵六'],['id' => 3, 'pushDate' => '', 'name' => 'san歌'],['id' => 4, 'pushDate' => '', 'name' => '四字'],['id' => 5, 'pushDate' => '', 'name' => '吴老爷'],];foreach ($data as $v) {$pushDate = date('Y-m-d H:i:s');$v['pushDate'] = $pushDate;Yii::$app->queue2->delay(30)->push(new ImportUserJob($v));}
5. 启动/监听队列
yii2 使用command命令启动队列 命令有:
1. php yii queue/info
查看目前去队列信息,主要是读取存储的数据,貌似yii2框架队列的数据一直会存储在redis中
2. php yii queue/run
直接运行队列,跑完后会终止进程
3. php yii queue/listen
监听队列,只要有新的队列过来就会处理,进程直到自行关闭才回退出
- yii queue/clear//清空初始化
- yii queue/run // 执行
- yii queue/listen //监听队列
- yii queue/info 来//队列状态
yii queue/listen [wait]
listen命令启动一个守护进程,它可以无限查询队列。如果有新的任务,他们立即得到并执行。
wait是下一次查询队列的时间 当命令正确地通过supervisor来实现时,这种方法是最有效的。
yii queue/run
run命令获取并执行循环中的任务,直到队列为空。适用与cron。
run与listen命令的参数:
—verbose,-v: 将执行状态输出到控制台。
—isolate: 详细模式执行作业。如果启用,将打印每个作业的执行结果。
—color: 高亮显示输出结果。
yii queue/info
info命令打印关于队列状态的信息。
6. 使用Supervisor将队列任务启动 添加到守护进程中
推荐安装Supervisor,将 php yii queue/listen 等一系列队列进程,添加到进程保护中,防止中途崩溃时候,可以自救,哈哈~?
关于Supervisor,可以参考《centos安装Supervisor以及简单配置(添加进程守护)》
完成上面,我们即可以通过控制器的路由,发起请求,然后添加数据到队列中,让队列去异步执行剩下的操作了~
总结
-
- 安装yiisoft/yii2-queue
-
- 配置
-
- 创建队列任务类
-
- 控制器将数据添加到队列中
-
- 启动/监听队列
-
- 使用Supervisor将队列任务启动 添加到守护进程中
文章来源:https://blog.yxccan.cn/blog/detail/29
- 使用Supervisor将队列任务启动 添加到守护进程中
本文由 我爱PHP169 作者:admin 发表,其版权均为 我爱PHP169 所有,文章内容系作者个人观点,不代表 我爱PHP169 对观点赞同或支持。如需转载,请注明文章来源。