laravel队列使用场景(laravel的队列)

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

本文主要介绍了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

(0)

相关推荐

  • 大文件分片上传

    技术大文件分片上传 大文件分片上传1、选择本地视频,获取视频实体
    第一步::auto-upload="false";:on-change="videoSaveToUrl"
    el-upload
    actio

    礼包 2021年12月18日
  • sparkmllib实战例子(sparkmllib学习方法)

    技术基于Spark Mllib文本分类的示例分析这篇文章将为大家详细讲解有关基于Spark Mllib文本分类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基于Spark M

    攻略 2021年12月16日
  • 一堂好课的标准是什么,怎么上课才算是成功的一堂课

    技术一堂好课的标准是什么,怎么上课才算是成功的一堂课成功的一堂课就是师生互感满意的课堂并且符合评课的各个标准一堂好课的标准是什么!一、从老师的角度来说这一节课,老师感觉自己要讲的内容都很好的呈现出来。这一节课,老师感觉学

    生活 2021年10月25日
  • MYSQL在双MASTER环境中由ROW日志模式带来的数据是否一致

    技术MYSQL在双MASTER环境中由ROW日志模式带来的数据是否一致MYSQL在双MASTER环境中由ROW日志模式带来的数据是否一致,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题

    攻略 2021年11月20日
  • tomcat环境变量正确无法启动(eclipse启动tomcat拒绝访问)

    技术如何解决eclipse配置Tomcat和Tomcat出现无效端口问题小编给大家分享一下如何解决eclipse配置Tomcat和Tomcat出现无效端口问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,

    攻略 2021年12月16日
  • Java框架与组件技术复习

    技术Java框架与组件技术复习 Java框架与组件技术复习java框架与组件技术解释ORM思想的主要内容
    对象映射到关系型数据库中,建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表

    礼包 2021年12月17日