Yii2队列的简单使用

高性能离不开异步,异步离不开队列。
下面将介绍Yii2框架怎么使用队列进行一些异步处理。

在系统很多模块可能同步处理需要很长时间,比如发送邮件、视频转码、日志存储等。
假如系统处理这些功能模块都是使用同步处理的话,那么系统性能必将大大降低。
所以我们可以考虑异步进行处理这些长进程任务。
下面将介绍Yii2的队列,即可以实现异步处理这些任务。

关于队列入门知识可以参考《redis消息队列简单应用

概括

    1. 安装yiisoft/yii2-queue
    1. 配置
    1. 创建队列任务类
    1. 控制器将数据添加到队列中
    1. 启动/监听队列
    1. 使用Supervisor将队列任务启动 添加到守护进程中

1. 安装yiisoft/yii2-queue

直接使用 composer 命令:

  1. 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

  1. 'bootstrap' => ['log','queue'],

基础配置如下:

  1. 'redis' => [
  2. 'class' => 'yii\redis\Connection',
  3. 'hostname' => '192.168.30.80',
  4. 'port' => 6379,
  5. 'database' => 2,
  6. ],
  7. 'queue' => [
  8. 'class' => 'yii\queue\redis\Queue',
  9. 'redis' => 'redis',
  10. 'channel' => 'queue',
  11. ],

3. 创建队列任务类

  1. <?php
  2. namespace app\jobs;
  3. use yii;
  4. use yii\base\BaseObject;
  5. use yii\queue\RetryableJobInterface;
  6. class ImportUserJob extends BaseObject implements RetryableJobInterface
  7. {
  8. public $data;
  9. public function __construct($data)
  10. {
  11. $this->data = $data;
  12. return $this;
  13. }
  14. //处理单个任务的最大时间
  15. public function getTtr()
  16. {
  17. return 2;
  18. }
  19. //任务超时(超过getTtr配置的时间), 重复 加入队列 的次数 $attempt
  20. public function canRetry($attempt, $error)
  21. {
  22. return ($attempt < 3) && ($error);
  23. }
  24. //执行队列
  25. public function execute($queue)
  26. {
  27. $data = $this->data;
  28. date_default_timezone_set('PRC');
  29. Yii::$app->mailer->compose('layouts/login', [
  30. 'dateTime' => date('Y-m-d H:i:s'),
  31. 'h2' => $data['name'],
  32. 'h3' => $data['id'],
  33. 'pushDate' => $data['pushDate'],
  34. 'code' => 0,
  35. 'msg' => 'OK'
  36. ])
  37. ->setTo('123456789@qq.com')
  38. ->setSubject('发送用户请求信息')
  39. ->send();
  40. }
  41. }

//以上配置,2秒执行一个任务,要是没有执行完,那么将重复加入队列中执行(3次),这样会重复执行多次任务

4. 控制器将数据添加到队列中

  1. //入队操作
  2. $data = [
  3. ['id' => 1, 'pushDate' => '', 'name' => '小一'],
  4. ['id' => 2, 'pushDate' => '', 'name' => '赵六'],
  5. ['id' => 3, 'pushDate' => '', 'name' => 'san歌'],
  6. ['id' => 4, 'pushDate' => '', 'name' => '四字'],
  7. ['id' => 5, 'pushDate' => '', 'name' => '吴老爷'],
  8. ];
  9. foreach ($data as $v) {
  10. $pushDate = date('Y-m-d H:i:s');
  11. $v['pushDate'] = $pushDate;
  12. Yii::$app->queue2->delay(30)->push(new ImportUserJob($v));
  13. }

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以及简单配置(添加进程守护)


完成上面,我们即可以通过控制器的路由,发起请求,然后添加数据到队列中,让队列去异步执行剩下的操作了~

总结

    1. 安装yiisoft/yii2-queue
    1. 配置
    1. 创建队列任务类
    1. 控制器将数据添加到队列中
    1. 启动/监听队列
    1. 使用Supervisor将队列任务启动 添加到守护进程中

      文章来源:https://blog.yxccan.cn/blog/detail/29

本文由 我爱PHP169 作者:admin 发表,其版权均为 我爱PHP169 所有,文章内容系作者个人观点,不代表 我爱PHP169 对观点赞同或支持。如需转载,请注明文章来源。

发表回复