聊聊 Laravel 的队列机制,了解一下队列的使用场景
发布时间 - 2021-12-20 00:00:00 点击率:次如何使用 laravel 队列?下面由laravel教程栏目给大家介绍一下使用 laravel 队列的方法,以及使用队列的场景,希望对大家有所帮助!
为什么 ?
首先,我们要知道为什么要使用队列,不使用队列会怎么样!优缺点如何
我们可以举例 几个简单场景。
邮件发送
邮件发送一般会面临哪些问题 ??
- 发送缓慢
- 发送失败
- 发送频率过高,被服务商拒绝 又或者 被进入垃圾箱
使用队列的好处在与哪里
-
提高客户端响应
当发送时,我们不要立即处理,而是丢给服务器,且队列进行管理和调度。 你可以自定义选择立即发送 或者 根据配置延迟发送
-
提高容错能力
在发送过程中,或许我们可能会遇到,目标被拒绝。例如大多数人 会遇到给
admin@qq.comn发送报错 502 的场景。 那这种场景,那么这种场景,我们可以理解其为是一个事件,在邮件发送的过程中,我们可以 引发构建出如下几种事件- 发送失败
- 邮件记录入库
- 代码异常
- 邮件发送成功回调
- 发送失败重试
通过此邮件发送,可能会导致多个耗时任务的产生,那我们其实也可以构建出多个 队列服务 出来。每个队列管理 自己的事情,很好的 解耦 他们
通过 Laravel 队列 可以很好的进行设置 立即发送、延迟发送、重试发送
-
发送频率可控
使用过批量发送的邮件的 开发者 必然会遇到一个问题,那便是,如果我们直接进行批量发送,即同一时间 进行大量的邮件发送。那么邮件服务商很可能会把我们的邮件给拒绝 或者 邮件进入垃圾箱,被识别为 广告那么,这里便是用到了 延迟发送,我们可以根据当前队列服务中,已知的 正在等待 投递的邮件,合理的配置频率,或者 切换邮件配置,来达到,频率可控。
如设置 一个配置一分钟之类发送10次,等等方案。 同样,我们这里可以做到 配置、频率控制、发送控制 解耦
其他
当然 我们还有很多种情况都会用到
- 服务器端下载 excel
- 服务器端异步多任务处理 大数据
- 错误消息处理
如何使用 Laravel 队列
这里只是列出,大概的使用方向,和如何更好的去使用。代码可能跑不起起来,主要是理解 逻辑 我们这里 使用的是 Redis 作为驱动
驱动设置为 Redis
> .env QUEUE_CONNECTION=redis > 在 config/queue.php 中可以找到
快速创建队列 和 投递任务
# 创建 任务 php artisan make:job ProcessPodcast
自动生成 app/Jobs/EmailJob.php
class EmailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $data;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(array $data)
{
$this->data = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$service = new EmailService();
// ... 检查当前可用 Mailer
// 这里你自定义就好了,这个方法中你可以根据你自己的配置,获取到当前可用的配置
$mailer = $service->getMailer();
// ... 获取当前要发送的数据
$data = $this->data;
$service->send($mailer, $data);
}
}一些常用操作
这些操作都能从 文档中找到
调用 发送
# 延迟 2分钟 发送 # 这里使用的是 Crontab 包 (不过 Laravel 自带) EmailJob::dispatch()->delay(now()->addMinutes(2)); # 立即发送 (不会进入到队列中) EmailJob::dispatchNow();
这里的队列默认用的 是 defult 队列,我们可以修改为指定队列服务
public function __construct(array $data)
{
# 使用 emailQueue
$this->onQueue('emailQueue');
$this->data = $data;
}设置失败情况下重试次数
# 重试 5 次 public $tries = 5;
设置超时时间
/**
* 确定任务应该超时的时间
*
* @return \DateTime
*/
public function retryUntil()
{
return now()->addMinutes(10);
}启动我们的队列
如果不配置 onQueue 的话,可以不带 ---queue 参数配置
php artisan queue:work --queue=emailQueue
结合 Events 来解耦
Laravel Event 也是通过 队列实现的
# 创建 Event
php artisan make:event FailEvent
class FailEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
protected $data;
protected $tag;
/**
* @param array $data 投递的数据
* @param string $tag 要操作的事情
*/
public function __construct(array $data, string $tag = 'system')
{
$this->data = $data;
$this->tag = $tag;
}
}
# 创建 listener
php artisan make:listener FailListener
class FailListener
{
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(FailEvent $event)
{
$this->{$event->tag}($event->data);
}
/**
* 处理系统异常
* DateTime: 2025/12/3 11:02 上午
* @param array $data
*/
public function system(array $data)
{
}
/**
* 处理邮件异常
* DateTime: 2025/12/3 11:02 上午
*/
public function email()
{
}
}
# app/Providers/EventServiceProvider.php
protected $listen = [
FailEvent::class => [
FailListener::cl
ass,
],
]
# 投递
event(new FailEvent(['error' = '异常信息'], 'email'));其他
其实,Laravel 大多数帮我实现了整个流程而已。可以尝试自己使用 redis 来实现一个可控队列。熟练是掌握 Redis 相关数据类型即可. 这里简要列出 Redis 中,在以上模式中会用到的数据类型
-
List
使用 它可以完成 出栈 入栈的 队列功能
-
Hash
使用他 可以用来存储,序列化后的 Event 或者 Job __construct 传入进去的数据,尽量不要将整个 类 序列化进去
也可以实现存储,Mailer 数据
-
Sorted Set
可以 设置时间为 Sorted Set 中的分数,通过分数排序,找到我们最近要执行的队列任务
当然,Redis 的用法还有很多,满足自己的需求即可。
世界上没有完美的解决方案,只有最适合你自己的方案,在工作中遇到问题,尽量要学会举一反三,合理的运用各种 工具,设计方案去实现。 代码 只是最终一个缩影而已,最终的要学会理解,每个语言 每个框架,也只是一种方案的实现,融会贯通才无敌 ...
更多编程相关知识,请访问:编程入门!!
# laravel
# php
# 数据类型
# 栈
# Event
# 事件
# 异步
# redis
# excel
# 自己的
# 邮件发送
# 我们可以
# 重试
# 的是
# 很好
# 多个
# 自定义
# 可以根据
# 如何使用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建支持数据库操作的智能建站平台?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Laravel如何为API编写文档_Laravel API文档生成与维护方法
JS中对数组元素进行增删改移的方法总结
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
网站图片在线制作软件,怎么在图片上做链接?
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel中的Facade(门面)到底是什么原理
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
iOS UIView常见属性方法小结
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
php json中文编码为null的解决办法
如何登录建站主机?访问步骤全解析
历史网站制作软件,华为如何找回被删除的网站?
如何在IIS服务器上快速部署高效网站?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
在线制作视频的网站有哪些,电脑如何制作视频短片?
教你用AI润色文章,让你的文字表达更专业
图册素材网站设计制作软件,图册的导出方式有几种?
js代码实现下拉菜单【推荐】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Laravel storage目录权限问题_Laravel文件写入权限设置
Laravel如何实现API版本控制_Laravel版本化API设计方案
如何在腾讯云服务器快速搭建个人网站?
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
详解jQuery中基本的动画方法
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
详解Android——蓝牙技术 带你实现终端间数据传输
如何在 Pandas 中基于一列条件计算另一列的分组均值
详解Oracle修改字段类型方法总结
linux写shell需要注意的问题(必看)
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化


ass,
],
]
# 投递
event(new FailEvent(['error' = '异常信息'], 'email'));