Laravel队列使用的场景和好处是什么,使用方法是怎样
Admin 2022-06-15 群英技术资讯 1268 次浏览
关于“Laravel队列使用的场景和好处是什么,使用方法是怎样”的知识有一些人不是很理解,对此小编给大家总结了相关内容,具有一定的参考借鉴价值,而且易于学习与理解,希望能对大家有所帮助,有这个方面学习需要的朋友就继续往下看吧。
首先,我们要知道为什么要使用队列,不使用队列会怎么样!优缺点如何
我们可以举例 几个简单场景。
邮件发送
邮件发送一般会面临哪些问题 ??
使用队列的好处在与哪里
提高客户端响应
当发送时,我们不要立即处理,而是丢给服务器,且队列进行管理和调度。 你可以自定义选择立即发送 或者 根据配置延迟发送
提高容错能力
在发送过程中,或许我们可能会遇到,目标被拒绝。例如大多数人 会遇到给 admin@qq.comn 发送报错 502 的场景。 那这种场景,那么这种场景,我们可以理解其为是一个事件,在邮件发送的过程中,我们可以 引发构建出如下几种事件
通过此邮件发送,可能会导致多个耗时任务的产生,那我们其实也可以构建出多个 队列服务 出来。每个队列管理 自己的事情,很好的 解耦 他们
通过 Laravel 队列 可以很好的进行设置 立即发送、延迟发送、重试发送
发送频率可控
使用过批量发送的邮件的 开发者 必然会遇到一个问题,那便是,如果我们直接进行批量发送,即同一时间 进行大量的邮件发送。那么邮件服务商很可能会把我们的邮件给拒绝 或者 邮件进入垃圾箱,被识别为 广告那么,这里便是用到了 延迟发送,我们可以根据当前队列服务中,已知的 正在等待 投递的邮件,合理的配置频率,或者 切换邮件配置,来达到,频率可控。
如设置 一个配置一分钟之类发送10次,等等方案。 同样,我们这里可以做到 配置、频率控制、发送控制 解耦
其他
当然 我们还有很多种情况都会用到
如何使用 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
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: 2021/12/3 11:02 上午
* @param array $data
*/
public function system(array $data)
{
}
/**
* 处理邮件异常
* DateTime: 2021/12/3 11:02 上午
*/
public function email()
{
}
}
# app/Providers/EventServiceProvider.php
protected $listen = [
FailEvent::class => [
FailListener::class,
],
]
# 投递
event(new FailEvent(['error' = '异常信息'], 'email'));其实,Laravel 大多数帮我实现了整个流程而已。可以尝试自己使用 redis 来实现一个可控队列。熟练是掌握 Redis 相关数据类型即可. 这里简要列出 Redis 中,在以上模式中会用到的数据类型
List
使用 它可以完成 出栈 入栈的 队列功能
Hash
使用他 可以用来存储,序列化后的 Event 或者 Job __construct 传入进去的数据,尽量不要将整个 类 序列化进去
也可以实现存储,Mailer 数据
Sorted Set
可以 设置时间为 Sorted Set 中的分数,通过分数排序,找到我们最近要执行的队列任务
当然,Redis 的用法还有很多,满足自己的需求即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本篇文章给大家带来了关于Laravel请求声明周期的相关知识,请求生命周期有不同的术语,如自动加载器、内核、服务提供器、调度请求和路由等,希望对大家有帮助。
php命令模式的理解:1、把请求封装成一个对象,允许使用不同的请求来参数化客户。对请求进行排队或记录请求日志,并支持可撤销动作。2、组成有命令抽象类、具体命令类等。
今天小编就为大家分享一篇laravel 查询数据库获取结果实现判断是否为空,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
sqlite在php中是默认安装的本地小型化数据库,类似于xml的小型数据库,但sqlite功能更强。
抽象类:是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。 接口:主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008