队列

2018-10-29  本文已影响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')

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

//> 手动打开监听,执行当前不要被执行的队列任务。该进程需要我们手动结束
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_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(){
    //> 任务失败时,该事件被执行
});

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

上一篇 下一篇

猜你喜欢

热点阅读