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. 创建队列任务类
<?php
namespace 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配置的时间), 重复 加入队列 的次数 $attempt
public 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 对观点赞同或支持。如需转载,请注明文章来源。