这篇文章主要介绍了Laravel的队列机制怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

成都创新互联公司专注于企业全网整合营销推广、网站重做改版、米东网站定制设计、自适应品牌网站建设、成都h5网站建设、商城建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为米东等各大城市提供网站开发制作服务。
为什么 ?
首先,我们要知道为什么要使用队列,不使用队列会怎么样!优缺点如何
我们可以举例 几个简单场景。
邮件发送
邮件发送一般会面临哪些问题??
- 发送缓慢 
- 发送失败 
- 发送频率过高,被服务商拒绝 又或者 被进入垃圾箱 
使用队列的好处在与哪里
- 提高客户端响应 - 当发送时,我们不要立即处理,而是丢给服务器,且队列进行管理和调度。 你可以自定义选择立即发送 或者 根据配置延迟发送 
- 提高容错能力 - 在发送过程中,或许我们可能会遇到,目标被拒绝。例如大多数人 会遇到给 - 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: 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的队列机制怎么用”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!
文章题目:Laravel的队列机制怎么用
URL标题:http://www.scyingshan.cn/article/jdcgpg.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 