Laravel 实现 队列 发送邮件功能

news2025/4/15 2:26:12

一. 什么是队列

在构建 Web 应用程序时,你可能需要执行一些任务,例如解析文件,发送邮件,大量的数据计算等等,这些任务在典型的 Web 请求期间需要很长时间才能执行

庆幸的是,Laravel 可以创建在后台运行的队列任务。 通过将时间密集型任务移至队列,你的应用程序可以以极快的速度响应 Web 请求,并为你的客户提供更好的用户体验。

说人话:laravel可以轻松创建,后台运行的队列,再将耗时的任务移到队列,减少用户在页面上的等待时间,提高用户体验。

二. 配置队列驱动

队列驱动 就是 以哪个方式来处理队列任务。

常见的驱动如下:
在这里插入图片描述

1.sync 驱动 (同步)

.env 文件 编辑

QUEUE_CONNECTION=sync

特点是: 任务立即执行,不进入队列, 适合开发和测试环境,请求会阻塞直到任务完成

我一般是本地和测试使用,如果使用这个,那就跟队列没什么关系了,直接同步执行

2. database 驱动

QUEUE_CONNECTION=database

数据库驱动时,肯定首先需要创建数据表的。用来存储队列服务的。如下

php artisan queue:table
php artisan migrate

会创建两个表,存储任务数据
在这里插入图片描述
打开 config/queue.php 文件,配置一下

'database' => [
    'driver' => 'database',
    'table' => 'jobs',
    'queue' => 'default',
    'retry_after' => 90,
],

特点是:使用的是数据库存储任务,不需要单独配置服务,有数据库即可,适合中小规模项目

3. redis 驱动 (推荐)

QUEUE_CONNECTION=redis

打开 config/queue.php 文件,配置一下

 'redis' => [
     'driver' => 'redis',
     'connection' => 'default',
     'queue' => env('REDIS_QUEUE', 'default'),
     'retry_after' => 90,
     'block_for' => null,
     'after_commit' => false,
 ],

注意
利用 redis 做为驱动的话,前提一定要配置好 redis

特点:高性能适合生产环境支持队列优先级

其他的驱动,暂时不做说明,大家可以自己去研究下。

三.创建队列任务

1. 生成任务类

php artisan make:job ProjectJob

生成的文件位于 app/Jobs/ProjectJob.php

2.任务类开发逻辑

<?php

namespace App\Jobs;

use App\Http\Services\ProjectService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;

/**
 * 项目工程队列
 */
class ProjectJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public array $reqData;

    /**
     * 任务支持错误,可尝试的次数。
     *
     * @var int
     */
    public $tries = 5;
    
    /**
     * Create a new job instance.
     */
    public function __construct($data = [])
    {
        $this->reqData = $data;

        $this->onQueue('project-compute');
    }

    /**
     * Execute the job.
     */
    public function handle(): void
    {
        $data = $this->reqData;
		
		// 开始发送邮件功能,大量耗时的任务开始编码
		
        Log::info("===project-compute-Log===", [$data, $res]);
    }

}

3.唯一任务实现

有时,希望这个队列在任务时间点,只有一个任务的实例,只需要实现 ShouldBeUnique 即可。

<?php

use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Queue\ShouldBeUnique;

class ProjectJob implements ShouldQueue, ShouldBeUnique
{

    public $Project;

    /**
     * 唯一锁将被释放的秒数
     *
     * @var int
     */
    public $uniqueFor = 20;

    /**
     * 任务的唯一 ID
     */
    public function uniqueId(): string
    {
        return $this->Project->id;
    }
}

如上:同一个 Project->id 在 20 秒内,都会被忽略,当 20 秒后,相同的id任务会再次分配到队列

四. 分发队列任务

分发,也就是怎么在控制器里面 去 将任务 丢到队列。

1.基本分发方式

ProjectJob ::dispatch(['data':"123"]);

2.延迟分发,10分钟后

ProjectJob ::dispatch(['data':"123"])->delay(now()->addMinutes(10));;

3.同步分发,立即执行

ProjectJob ::dispatchSync(['data':"123"]);

4. 指定队列

ProjectJob ::dispatch(['data':"123"])->onQueue('high');

五. 队列工作进程管理

1. 启动队列工作进程

php artisan queue:work

在这里插入图片描述

2. 常用选项

# 指定队列连接
php artisan queue:work --queue=high

php artisan queue:work --queue=high,default

--queue=high,default 是启动了一个工作进程,但该进程会按照优先级处理多个队列中的任务

3. 重启队列

在队列的代码修改了,那么就需要重启队列。

php artisan queue:restart

由于队列任务是长期存在的进程,如果不重新启动,他们不会注意到代码的更改。

可以通过发出 queue:restart 命令优雅地重新启动所有进程

queue:restart 说明:
  1. 不是真正的进程重启:

    • 不会终止或重新创建现有的队列工作进程

    • 不会改变进程ID(PID)或端口

    • 现有进程会继续完成当前正在处理的任务

  2. 优雅重启机制:

    • 在存储系统(缓存/数据库)中设置重启标记

    • 工作进程在完成当前任务后检查到标记,会自行退出

    • 进程管理器(如Supervisor)会自动重新启动新进程

注意

我的队列进程就是 用 Supervisor 托管的,所以在 queue:restart 后,Supervisor 会自动重启我的队列进程。

在这里插入图片描述
当前队列进程启动后,在控制器内,丢入任务到队列,队列就会排队处理任务了。

如下图所示,队列的处理日志。
在这里插入图片描述

六. 处理失败的任务

在任务处理失败时,队列会先尝试在运行几次,见 2.任务类开发逻辑tries 参数,超过此尝试次数后,它将被插入到 failed_jobs 数据库表中

php artisan queue:failed-table

php artisan migrate

可以使用 queue:failed-table 命令来创建迁移错误任务表

1.查看失败任务

php artisan queue:failed

如图:
在这里插入图片描述

2. 重试失败的任务

#重试单个任务id
php artisan queue:retry ce7bb17c-cdd8-41f0-a8ec-7b4fef4e5ece

# 重试多个任务id
php artisan queue:retry ce7bb17c-cdd8-41f0-a8ec-7b4fef4e5ece 91401d2c-0784-4f43-824c-34f94a33c24d

# 重试指定队列的所有失败任务
php artisan queue:retry --queue=name

#重试所有失败任务
php artisan queue:retry all

执行后

在这里插入图片描述

3.清理失败任务

#要删除指定的失败任务
php artisan queue:forget 91401d2c-0784-4f43-824c-34f94a33c24d

# 删除 failed_jobs 表中所有失败任务
php artisan queue:flush

如图
在这里插入图片描述

通过以上配置和使用方法,你可以充分利用Laravel队列系统来提高应用性能和用户体验。

在实际的使用中,会遇到各种问题,大家可以自行去拓展,里面有很多的参数设置和功能,我这边就不一一去说明,边用边学。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一、绪论(Introduction of Artificial Intelligence)

写在前面&#xff1a; 老师比较看重的点&#xff1a;对问题的概念本质的理解&#xff0c;不会考试一堆运算的东西&#xff0c;只需要将概念理解清楚就可以&#xff0c;最后一个题会出一个综合题&#xff0c;看潜力&#xff0c;前面的部分考的不是很深&#xff0c;不是很难&…

Web攻防—SSRF服务端请求伪造Gopher伪协议无回显利用

前言 重学Top10的第二篇&#xff0c;希望各位大佬不要见笑。 SSRF原理 SSRF又叫服务端请求伪造&#xff0c;是一种由服务端发起的恶意请求&#xff0c;SSRF发生在应用程序允许攻击者诱使服务器向任意域或资源发送未经授权的请求时。服务器充当代理&#xff0c;执行攻击者构造…

【时时三省】(C语言基础)选择结构程序综合举例

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 下面综合介绍几个包含选择结构的应用程序。 例题1&#xff1a; 写一程序&#xff0c;判断某一年是否为闰年。 程序1&#xff1a; 先画出判别闰年算法的流程图&#xff0c;见下图用变量le…

File 类 (文件|文件夹操作)

一、File 类 1.1 前言 在 JDK 中 通过 java.io.File 类&#xff0c;可以实现操作系统重文件|文件夹的创建、删除、查看、重命名等操作。 1.2 File 类构造方法 File 一共提供了四个构造方法&#xff0c;都是有参构造。其中最常使用的是 File(String) 和 File(String, String)…

Hadoop文件操作指南:深入解析文件操作

1 Hadoop文件系统概述 Hadoop分布式文件系统(HDFS)是Hadoop生态的核心存储组件&#xff0c;专为大规模数据集设计&#xff0c;具有高容错性和高吞吐量特性。 HDFS核心特性: 分布式存储&#xff1a;文件被分割成块(默认128MB)分布存储多副本机制&#xff1a;每个块默认3副本&…

STM32 HAL库之EXTI示例代码

外部中断按键控制LED灯 在main.c中 HAL_Init(); 初始化Flash&#xff0c;中断优先级以及HAL_MspInit函数&#xff0c;也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …

《TCP/IP网络编程》学习笔记 | Chapter 23:IOCP

《TCP/IP网络编程》学习笔记 | Chapter 23&#xff1a;IOCP 《TCP/IP网络编程》学习笔记 | Chapter 23&#xff1a;IOCP通过重叠 I/O 理解 IOCPepoll 和 IOCP 的性能比较实现非阻塞模式的套接字以纯重叠 I/O 方式实现回声服务器端重新实现客户端测试从重叠 I/O 模型到 IOCP 模型…

CAD导入arcgis中保持面积不变的方法

1、加载CAD数据&#xff0c;选择面数据&#xff0c;如下&#xff1a; 2、加载进来后&#xff0c;右键导出数据&#xff0c;导出成面shp数据&#xff0c;如下&#xff1a; 3、选择存储路径&#xff0c;导出面后计算面积&#xff0c;如下&#xff1a; 4、与CAD中的闭合线面积核对…

rustdesk自建服务器怎么填写客户端配置信息

目录 # id、api、中继都怎么填&#xff1f;rustdesk程序启动后服务不自动启动 # id、api、中继都怎么填&#xff1f; rustdesk程序启动后服务不自动启动 完全退出RudtDesk程序&#xff08;右下角托盘区有的话&#xff0c;需要右键点退出&#xff09; 创建windows服务&#xff…

c++进阶之----智能指针

1.概念 在 C 中&#xff0c;智能指针是一种特殊的指针类型&#xff0c;它封装了裸指针&#xff08;raw pointer&#xff09;的行为&#xff0c;并通过 RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;机制自动管理动态分配的…

六、测试分类

设计测试用例 万能公式&#xff1a;功能测试性能测试界面测试兼容性测试安全性测试易用性测试 弱网测试&#xff1a;fiddler上行速率和下行速率 安装卸载测试 在工作中&#xff1a; 1.基于需求文档来设计测试用例&#xff08;粗粒度&#xff09; 输入字段长度为6~15位 功…

AI编程案例拆解|基于机器学习XX评分系统-前端篇

文章目录 1. 定价使用DeepSeek估价小红书调研 2. 确定工作事项利用DeepSeek生成具体工作事项 3. 和客户沟通约会议沟通确定内容样式 4. 前端部分设计使用DeepSeek生成UI设计在Cursor中生成并提问前置条件开始编程 关注不迷路&#xff0c;励志拆解100个AI编程、AI智能体的落地应…

java数组06:Arrays类

Arrays类 数组的工具类java.util. Arrays 由于数组对象本身并没有什么方法可以供我们调用,但API中是了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。 查看JDK帮助文档 Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用…

TQTT_KU5P开发板教程---实现流水灯

文档实现功能介绍 本文档是学习本开发板的基础&#xff0c;通过设置计数器使led0到led7依次闪烁&#xff0c;让用户初步认识vivado基本的开发流程以及熟悉项目的创建。本开发板的所有教程所使用的软件都是vivado2024.1版本的。可以根据网上的教程下载与安装。 硬件资源 此次教程…

Model Context Protocol(MCP)模型上下文协议

Model Context Protocol&#xff08;MCP&#xff09;模型上下文协议 前言一、什么是MCP二、MCP的作用三、MCP与Function call对比四、构建一个简单的MCP DEMO环境准备实现MCP Server运行 ServerMCP Client端配置验证 总结 前言 在Agent时代&#xff0c;将Agent确立为大模型未来…

第十二章:FreeRTOS多任务创建与删除

FreeRTOS多任务创建与删除教程 概述 本教程介绍FreeRTOS多任务的创建与删除方法&#xff0c;主要涉及两个核心函数&#xff1a; 任务创建&#xff1a;xTaskCreate()任务删除&#xff1a;vTaskDelete() 实践步骤 1. 准备工程文件 复制005工程并重命名为006 2. 创建多个任务…

Seed-Thinking-v1.5:字节豆包新推理模型发布,200B参数战胜Deepseek

摘要 本文引入了Seed-Thinking-v1.5&#xff0c;能够在响应之前通过思考进行推理&#xff0c;从而提高了各种基准测试的性能。Seed-Thinking-v1.5在AIME 2024上获得86.7分&#xff0c;在Codeforces上获得55.0分&#xff0c;在GPQA上获得77.3分&#xff0c;展示了优秀的STEM和编…

AIDD-人工智能药物设计-提升分子预测反事实解释可靠性

UQ 过滤:提升分子预测反事实解释可靠性 目录 I-INF 指标结合 F1 评分,为评估大分子复合物(包括 RNA-蛋白质)的界面相互作用网络提供了可靠且全面的新方法。通过使用生成的人工 CAR 序列微调蛋白质语言模型(PLM),显著提高了 CAR-T 细胞活性的预测准确性,有效克服了合成蛋…

【前端】webpack一本通

今日更新完毕&#xff0c;不定期补充&#xff0c;建议关注收藏点赞。 目录 简介使用webpack默认只能处理js文件 ->引入加载器对JS语法降级&#xff0c;兼容低版本语法合并文件再次打包进阶 工作原理html-webpack-plugin插件webpack开发服务器引入使用webpack-dev-server模块…

代码学习总结(一)

代码学习总结&#xff08;一&#xff09; 这个系列的博客是记录下自己学习代码的历程&#xff0c;有来自平台上的&#xff0c;有来自笔试题回忆的&#xff0c;主要基于 C 语言&#xff0c;包括题目内容&#xff0c;代码实现&#xff0c;思路&#xff0c;并会注明题目难度&…