队列

作者: 爱折腾的傻小子 | 来源:发表于2018-10-29 10:59 被阅读19次

队列使用目的:将耗时的任务延时处理。(比如说发邮件等)


队列的配置文件在 config/queue.php

连接队列,就是config/queue.php 中的 QUEUE_DRIVER 和 connections 属性
每一个连接都对应一个属性。
其中null表示:队列驱动用于那些放弃队列的任务



数据库作为队列存储
通过Artisan命令生成队列相关数据表 jobs

php artisan queue:table     //> 生成迁移类 默认的是create_jobs_table迁移类
php artisan migrate         //> 执行迁移类 自动生成迁移表

需要修改 QUEUE_DRIVERdatabase


数据库类型队列,参数。
diriver 类型 database
table 存储数据表 jobs
queue 队列默认名称 default
retry_after 队列任务最长执行的时间;如果,只的那个的时间(s)还没执行完,那么将被释放队列而不是删除掉


生成任务类:所有的任务类都保存在app/Jobs目录下。

//> 生成任务类 Astisan 控制台; 生成文件位置app/Jobs
php artisan make:job SendReminderEmail

这里 handle() 书写需要加入队列的任务逻辑代码
当任务类被加入queue中时,任务类会被序列化存入数据库中
更多参考手册

委派任务
使用dispatch() 辅助函数 或 控制器的dispatch函数,需要的参数是一个类的实例对象

委派延时任务
使用 delay方法 在任务被创建指定的时间以后执行

使用 delay() 指定延迟时间; Carbon时间相关类
每次放入队列,都会被写入数据库中去

自定义 队列 和 连接
自定义队列需要我们在config/queue.php配置文件中配置相关队列名称
切换指定队列:config/queue.php配置如下

多个队列配置如上:使用如下:

切换指定的连接:onConnection('sqs') 等


这里的连接名称必须是配置文件中指定的几个。
总结:onConnection('sqs') 和 onQueue('email')
  • onConnection():指定连接驱动类型
  • onQueue():指定队列名称

运行队列进程:一旦我们放入队列,就需要监控判断当前任务是否该执行了。

//> 手动打开监听,执行当前不要被执行的队列任务。该进程需要我们手动结束
php artisan queue:work

队列优先级
有时候我们希望设置队列的优先级

php artisan queue:work --queue=bms,defalut  //> 左边的优先级大于右边

任务过期 和 超时
retry_after : 任务执行时间

//> --timeout 控制队列每个任务的最长时间,如果超时,该进程会被关闭
php artisan queue:work --timeout=60

处理失败的任务
laravel 设置任务允许的最大尝试次数,若是执行次数达到该限定,任务会被插入到failed_jobs表。配置项如下:

database : 数据库连接类型 mysql 这里是
table :任务错误保存数据表名称
使用迁移生成 failed_jobs 表:

php artisan queue:failed-table //> 生成迁移类文件
php artisan migrate  //> 执行迁移

通过 --tries 参数项来设置队列任务允许的最大尝试次数

php artisan queue:work redis --tries=3  //> redis连接最大次数
php artisan queue:work database --tries=2 //> database连接最大次数
//> 上面的和下面的Artisan基本使用一致
php artisan queue:work

清理 失败的任务

  • 任务类 中定义 failed 方法,从而允许你在失败发生 时执行指定的动作(比如:任务失败时通知,记录日志等)使用详情,参看手册

重试 失败的任务

//> 查看已被插入 failed_jobs 数据表中的所有的失败任务
php artisan queue:failed
//> 重试指定ID的失败任务
php artisan queue:retry 5
//> 重试所有失败任务
php artisan queue:retry all
//> 删除一个失败的任务
php artisan queue:forget 5
//> 删除所有失败的任务
php artisan queue:flush


任务 事件

//> 如果该邮件加入队列,那么在队列任务被执行后被执行(该方法只会被执行一次)
Queue::after(function(){
    //> 在邮件发送后执行
});
//> before 事件,在每次监听时,都会被执行一次
Queue::before(function(){
    //> 在邮件发送前被执行,在每次被监听时,也会被执行
});
//> 任务失败事件()任务失败时,该任务被执行
Queue::failing(function(){
    //> 任务失败时,该事件被执行
});

更多 队列 任务事件 查看手册

相关文章

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 队列

    文章结构 什么是队列 实现队列顺序队列链式队列循环队列 Java中的队列 1. 什么是队列 队列也是一种操作受限的...

  • iOS底层-- GCD源码分析(1)-- dispatch_qu

    手动目录认识队列队列的结构队列的产生主队列全局队列创建的队列管理队列 代码版本dispatch version :...

  • 队列,异步,同步,线程通俗理解

    一、队列 串行队列 并行队列 主队列(只在主线程执行的串行队列) 全局队列(系统的并行队列) 二、 任务(是否具有...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • OC多线程

    队列创建 线程与队列 队列线程间通信 队列组

  • GCD

    获得主队列 获得全局队列 串行队列 异步队列 同步队列 阻隔队列 (像栅栏一样 ) 例如 A -->栅栏 --...

  • 数据结构第三篇 队列

    队列的特性 前进先出。 我们来大致描述下进出队列的情况。 进队列 1 进队列现在队列是 12 进队列现在队列是 1...

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

  • Git 常用操作命令(持续更新)

    当前更新到stash队列 查看stash队列 清空队列 删除某个队列

网友评论

      本文标题:队列

      本文链接:https://www.haomeiwen.com/subject/qjmimttx.html