laravel框架中队列的用法介绍(附代码)
发布时间 - 2018-08-28 00:00:00 点击率:次本篇文章给大家带来的内容是关于laravel框架中队列的用法介绍(附代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
在实际的项目开发中,我们经常会遇到需要轻量级队列的情形,例如发短信、发邮件等,这些任务不足以使用 kafka、RabbitMQ 等重量级的消息队列,但是又的确需要异步、重试、并发控制等功能。通常来说,我们经常会使用 Redis、Beanstalk、Amazon SQS 来实现相关功能,laravel 为此对不同的后台队列服务提供统一的 API,本文将会介绍应用最为广泛的 redis 队列。
在讲解 laravel 的队列服务之前,我们要先说说基于 redis 的队列服务。首先,redis设计用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列
redis 队列的数据结构
List 链表
redis 做消息队列的特性例如FIFO(先入先出)很容易实现,只需要一个 list 对象从头取数据,从尾部塞数据即可。
相关的命令:(1)左侧入右侧出:lpush/rpop;(2)右侧入左侧出:rpush/lpop。
这个简单的消息队列很容易实现。
Zset 有序集合
有些任务场景,并不需要任务立刻执行,而是需要延迟执行;有些任务很重要,需要在任务失败的时候重新尝试。这些功能仅仅依靠 list 是无法完成的。这个时候,就需要 redis 的有序集合。
Redis 有序集合和 Redis 集合类似,是不包含相同字符串的合集。它们的差别是,每个有序集合的成员都关联着一个评分 score,这个评分用于把有序集合中的成员按最低分到最高分排列。
单看有序集合和延迟任务并无关系,但是可以将有序集合的评分 score 设置为延时任务开启的时间,之后轮询这个有序集合,将到期的任务拿出来进行处理,这样就实现了延迟任务的功能。
对于重要的需要重试的任务,在任务执行之前,会将该任务放入有序集合中,设置任务最长的执行时间。若任务顺利执行完毕,该任务会在有序集合中删除。如果任务没有在规定时间内完成,那么该有序集合的任务将会被重新放入队列中。
相关命令:
(1) ZADD 添加一个或多个成员到有序集合,或者如果它已经存在更新其分数。
(2) ZRANGEBYSCORE 按分数返回一个成员范围的有序集合。
(3) ZREMRANGEBYRANK 在给定的索引之内删除所有成员的有序集合。
laravel 队列服务的任务调度
队列服务的任务调度过程如下:
laravel 的队列服务由两个进程控制,一个是生产者,一个是消费者。这两个进程操纵了 redis 三个队列,其中一个 List,负责即时任务,两个 Zset,负责延时任务与待处理任务。
生产者负责向 redis 推送任务,如果是即时任务,默认就会向 queue:default 推送;如果是延时任务,就会向 queue:default:delayed 推送。
消费者轮询两个队列,不断的从队列中取出任务,先把任务放入 queue:default:reserved 中,再执行相关任务。如果任务执行成功,就会删除 queue:default:reserved 中的任务,否则会被重新放入 queue:default:delayed 队列中。
laravel 队列服务的总体流程
任务分发流程:
任务处理器运作:
创建任务
queue 设置
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => 90,
],在config/queue.php中进行配置
一般来说,默认的 redis
配置如上,connection 是 database 中 redis 的连接名称;queue 是 redis 中的队列名称,值得注意的是,如果使用的是 redis 集群的话,这个需要使用 key hash tag,也就是 {default};当任务运行超过 retry_after 这个时间后,该任务会被重新放入队列当中。
任务类的创建
任务类的结构很简单,一般来说只会包含一个让队列用来调用此任务的 handle 方法。
如果想要使得任务被推送到队列中,而不是同步执行,那么需要实现 IlluminateContractsQueueShouldQueue 接口。
如果想要让任务推送到特定的连接中,例如 redis 或者 sqs,那么需要设置 conneciton 变量。
如果想要让任务推送到特定的队列中去,可以设置 queue 变量。
如果想要让任务延迟推送,那么需要设置 delay 变量。
如果想要设置任务至多重试的次数,可以使用 tries 变量;
如果想要设置任务可以运行的最大秒数,那么可以使用 timeout 参数。
如果想要手动访问队列,可以使用 trait : IlluminateQueueInteractsWithQueue。
任务的分发
分发服务
写好任务类后,就能通过 dispatch 辅助函数来分发它了。唯一需要传递给 dispatch 的参数是这个任务类的实例:
class PodcastController extends Controller
{
public function store(Request $request)
{
// 创建播客...
ProcessPodcast::dispatch($podcast);
}
}如果想延迟执行一个队列中的任务,可以用任务实例的 delay 方法。
ProcessPodcast::dispatch($podcast)
->delay(Carbon::now()->addMinutes(10));通过推送任务到不同的队列,可以给队列任务分类,甚至可以控制给不同的队列分配多少任务。要指定队列的话,就调用任务实例的 onQueue 方法:
ProcessPodcast::dispatch($podcast)->onQueue('processing');如果使用了多个队列连接,可以将任务推到指定连接。要指定连接的话,可以在分发任务的时候使用 onConnection 方法:
ProcessPodcast::dispatch($podcast)->onConnection('redis
');
# laravel
# redis
# php
# 可以使用
# 的是
# 重试
# 多个
# 将会
# 可以用
# 很容易
# 经常会
# 会向
# 就会
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Laravel如何使用Livewire构建动态组件?(入门代码)
Python3.6正式版新特性预览
中山网站制作网页,中山新生登记系统登记流程?
Python数据仓库与ETL构建实战_Airflow调度流程详解
,怎么在广州志愿者网站注册?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
大连网站制作公司哪家好一点,大连买房网站哪个好?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何快速打造个性化非模板自助建站?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何在万网利用已有域名快速建站?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel如何使用模型观察者?(Observer代码示例)
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
微信小程序 require机制详解及实例代码
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Laravel如何配置Horizon来管理队列?(安装和使用)
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在云指建站中生成FTP站点?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何快速搭建二级域名独立网站?
免费视频制作网站,更新又快又好的免费电影网站?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
详解jQuery中的事件
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何登录建站主机?访问步骤全解析
网站制作大概多少钱一个,做一个平台网站大概多少钱?
HTML 中如何正确使用模板变量为元素的 name 属性赋值
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
西安专业网站制作公司有哪些,陕西省建行官方网站?
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
Laravel如何生成API文档?(Swagger/OpenAPI教程)
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
LinuxCD持续部署教程_自动发布与回滚机制
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Laravel如何使用Gate和Policy进行授权?(权限控制)
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区

