本文主要介绍了Laravel的队列机制是如何使用的,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解它。
00-1010首先,我们需要知道为什么使用队列,如果不使用队列会发生什么!优缺点?
我们可以举一些简单的例子。
邮件发送
邮件发送一般会面临哪些问题?
慢慢发送
发送失败。
发送频率过高,被服务商拒收或扔进垃圾箱。
使用队列的好处在与哪里
改善客户反应
发送时,我们不想马上处理,而是扔给服务器,队列被管理和调度。您可以根据配置自定义立即发送或延迟发送的选项。
提高容错能力。
在发送过程中,我们可能会遇到目标被拒绝的情况。例如,大多数人会遇到向admin@qq.comn发送错误502的场景。
这种场景,那么这种场景,我们可以理解为是一个事件。在发送邮件的过程中,我们可以触发以下事件。
发送这封电子邮件可能会导致多项耗时的任务,因此我们实际上可以建立多个队列服务.每个队列都管理自己的事务,解耦他们很好。
拉弗尔队列可以用来很好地设定立即发送,延迟发送和重试发送。
发送失败。
邮件记录入库
代码异常
邮件已成功发送回拨
发送失败重试
传输频率可控
使用过批量邮件的开发人员难免会遇到一个问题,那就是如果我们直接批量发送,也就是同时发送大量邮件。那么邮件服务提供商很可能会拒绝或邮件进入垃圾箱我们的邮件,并将其识别为广告.然后,这里是延迟发送.我们可以根据当前队列服务中等待投递的已知邮件合理配置频率或切换邮件配置,从而可以控制频率。
例如,将配置设置为每分钟发送10次,以此类推。
同样,我们可以在这里做配置、频率控制、发送控制 解耦。
其他
当然,还有很多其他情况我们可以利用。
服务器下载excel
服务器端异步多任务处理大数据
错误消息处理
如何使用 Laravel 队列
这里只是列出了大致的使用方向以及如何更好的使用。代码可能不会运行,主要是为了理解逻辑。
我们这里使用Redis作为驱动程序。
驱动设置为 Redis。包封/包围(动词envelop的简写)
QUEUE_CONNECTION=redis
快速创建队列 和 投递任务可以在config/queue.php中找到
#创建任务
phisanmake : jobprocesspodcast自动生成app/jobs/emailjob.php。
classEmailJobimplementsShouldQueue
{
useDispatchable,InteractsWithQueue,Queueable,SerializesModels
受保护的$数据;
/**
不间断空格
; * 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: 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 的用法还有很多,满足自己的需求即可。
世界上没有完美的解决方案,只有最适合你自己的方案,在工作中遇到问题,尽量要学会举一反三,合理的运用各种 工具,设计方案去实现。
代码 只是最终一个缩影而已,最终的要学会理解,每个语言 每个框架,也只是一种方案的实现,融会贯通才无敌 ...
感谢你能够认真阅读完这篇文章,希望小编分享的“Laravel的队列机制怎么用”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153650.html