0

0

聊聊 Laravel 的队列机制,了解一下队列的使用场景

青灯夜游

青灯夜游

发布时间:2021-12-20 16:52:49

|

2810人浏览过

|

来源于掘金社区

转载

如何使用 laravel 队列?下面由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

薏米AI
薏米AI

YMI.AI-快捷、高效的人工智能创作平台

下载
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 的用法还有很多,满足自己的需求即可。

世界上没有完美的解决方案,只有最适合你自己的方案,在工作中遇到问题,尽量要学会举一反三,合理的运用各种 工具,设计方案去实现。 代码 只是最终一个缩影而已,最终的要学会理解,每个语言 每个框架,也只是一种方案的实现,融会贯通才无敌 ...

更多编程相关知识,请访问:编程入门!!

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2628

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1629

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1511

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1418

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1447

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号