队列使用目的:将耗时的任务延时处理。(比如说发邮件等)
队列的配置文件在 config/queue.php 中
连接 和 队列,就是config/queue.php 中的 QUEUE_DRIVER 和 connections 属性
每一个连接都对应一个属性。
其中null表示:队列驱动用于那些放弃队列的任务
数据库作为队列存储:
通过Artisan命令生成队列相关数据表 jobs
php artisan queue:table //> 生成迁移类 默认的是create_jobs_table迁移类
php artisan migrate //> 执行迁移类 自动生成迁移表
需要修改 QUEUE_DRIVER 为 database
数据库类型队列,参数。
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(){
//> 任务失败时,该事件被执行
});
更多 队列 任务事件 查看手册
网友评论