发送邮箱验证消息


通过前面两篇先导篇教程,想必你已经对 Laravel 消息队列的基本使用和底层实现有了大致的了解,接下来,我们来具体介绍消息队列在 Laravel 项目不同业务场景下的使用示例、配置和线上运维。

Laravel 博客入门项目中,学院君就给大家演示过如何通过消息队列来实现邮件异步发送,可见邮件发送实在是 Laravel 消息队列最基本、最常见的使用场景,因为作为一个耗时任务,使用消息队列异步处理邮件发送可以加快页面响应速度,优化用户体验。

在这里,我们还是单独介绍下,以便你可以对如何使用消息队列处理 Laravel 应用邮件发送有一个更全面的认识,我们将以用户注册成功后需要进行邮箱验证这个业务场景为例进行演示。

编写邮件发送代码

在处理用户注册成功的控制器方法中,如果要发送验证邮件到用户邮箱来验证用户注册邮箱的有效性,通过 Mail 门面提供的方法进行邮件发送即可:

function store() { 
    // 对注册表单字段进行验证
    this->validate(...);   
    // 创建新用户,此时 email_verified 字段值为 false
    $user = User::create([ 
        ..., 
        'email_verified' => false 
    ]);
    // 发送验证邮件到该用户的注册邮箱
    Mail::to($user)->send(...);
    // 重定向到登录页面,提示用户验证邮箱后方可登录
    return redirect('/login?pending_verification=true');
}

在上面的代码中,还需要传递可邮寄类实例到 send 方法才能完成邮件发送,这里我们简化流程,突出重点,将其省略。

不过这样的邮件发送是同步发送的,要通过消息队列实现邮件的异步发送,可以专门编写一个用于发送验证邮件的队列任务类,这可以通过如下 Artisan 命令来创建:

php artisan make:job SendVerificationMessage

然后将上面的邮件同步发送代码转移到该任务类的 handle 方法中:

原来 to 方法中的 $user 实例参数改为通过该任务类的 $user 属性进行初始化:

接下来,回到控制器方法发送邮件的位置,将原来同步发送邮件的代码调整为推送邮件发送任务到消息队列进行异步处理即可:

配置消息队列驱动

最后,要让 Laravel 消息队列可以正常工作,还要在配置文件中对消息队列驱动进行配置,这里,我们可以使用 Redis,也可以使用数据库,如果使用 Redis 的话,需要配置好 Redis 连接,并启动 Redis 服务端,关于这些已经在先导篇中演示过了,不再赘述。

如果使用数据库的话,需要使用 Laravel 内置的 Artisan 命令创建相应的数据表:

php artisan queue:table
php artisan migrate

并且在 .env 中将消息队列驱动配置为 database

QUEUE_CONNECTION=database

执行消息队列任务

完成好以上代码编写和队列配置后,就可以走一遍用户注册流程进行测试了,此时如果还没有开启队列处理进程的话,可以在队列存储驱动(Redis 或数据库)中看到相应的队列任务信息,对于消息队列而言,也就是存储在其中的消息数据,其数据结构如下所示:

其中 id 表示编号,queue 表示被推送到的队列,payload 表示任务载荷数据(序列化后的任务实例),attempts 表示已尝试次数。

对于推送到消息队列中的任务处理,需要运行如下 Artisan 命令启动独立的控制台应用进程去消息队列读取任务并执行:

php artisan queue:work

Laravel 底层会根据 QUEUE_CONNECTION 配置自动判断存放队列任务的存储器,然后进行连接和读取,这一块的底层实现学院君已经在先导篇中介绍过。

如果消息队列中有任务的话,可以在终端看到输出的类似下面这种处理日志:

如果系统很繁忙,用户注册请求很多,一个队列处理进程忙不过来,可以启动多个进程并行处理,以便充分利用系统资源(多核 CPU),加快队列处理速度:


点赞 取消点赞 收藏 取消收藏

<< 上一篇: 目录索引 & 课程简介

>> 下一篇: 队列优先级