Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用 | 服务篇 | Laravel 5.1 基础教程


本站和网页 https://xueyuanjun.com/post/2012.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用 | 服务篇 | Laravel 5.1 基础教程
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Laravel 5.1 基础教程
目录索引
安装篇
3篇文章
在 Windows 中安装 Laravel 5.1.X
在 Windows 上进行 Laravel Homestead 安装、配置及测试
在 Laravel Homestead 中使用 Blackfire Profiler 对应用性能进行分析
基础篇
8篇文章
HTTP路由实例教程(一)—— 基本使用及路由参数
HTTP路由实例教程(二)—— 路由命名和路由分组
HTTP路由实例教程(三)—— CSRF攻击原理及其防护
中间件实例教程 —— 中间件的创建使用及中间件参数定义
HTTP控制器实例教程 —— 创建RESTFul风格控制器实现文章增删改查
HTTP 请求实例教程 —— 获取请求数据、Cookie及文件上传处理
HTTP响应实例教程 —— 基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向
Laravel 视图实例教程 —— 在视图间共享数据及视图Composer
底层篇
4篇文章
Laravel 5.x 启动过程分析
Laravel 服务容器实例教程 —— 深入理解控制反转和依赖注入
Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例
Laravel 门面实例教程 —— 创建自定义 Facades 类
数据库篇
12篇文章
Laravel 数据库实例教程 —— 使用DB门面操作数据库
Laravel 数据库实例教程 —— 使用查询构建器对数据库进行增删改查
Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
Eloquent ORM 实例教程 —— ORM概述、模型定义及基本查询
Eloquent ORM 实例教程 —— 模型创建、更新及批量赋值
Eloquent ORM 实例教程 —— 模型删除及软删除相关实现
Eloquent ORM 实例教程 —— 查询作用域和模型事件
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(一)
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(二)
在 Laravel 框架之外使用数据库查询构建器及 Eloquent ORM
将 Sequel Pro 中已存在的数据表导出为 Laravel 迁移文件
将 MySQL Workbench 中已存在的数据表导出到 Laravel 迁移文件
服务篇
29篇文章
Laravel Spark 牛刀初试 —— 安装、设置及使用
Laravel 实例教程 —— 如何在Laravel 5.1中进行自定义包开发
Laravel 5.1用户认证(一) —— 使用Laravel内置组件快速实现注册登录
Laravel 5.1用户认证(二) —— 使用Laravel内置组件快速实现密码重置
Laravel 5.1用户认证(三) —— 使用Socialite实现GitHub登录认证
Laravel 5.1 中的ACL用户授权及权限检查功能实现教程
Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
Laravel 支付解决方案之 Laravel Cashier (一)—— 安装配置篇
Laravel 支付解决方案之 Laravel Cashier (二)—— 付费会员&分期付款&生成发票
Laravel 支付解决方案之如何使用支付宝进行支付
Laravel 支付解决方案之如何使用银联支付进行支付
Laravel 支付解决方案之如何使用微信支付进行支付
Laravel 缓存实例教程(一) —— 基于Memcached缓存驱动的配置
Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化
Laravel中运行Gulp任务的利器 —— Laravel Elixir简介及入门教程
如何在 Laravel 5.1 中使用 Laravel Elixir 集成安装 Bootstrap
Laravel Elixir 深入探究(一):Elixir配置选项、前端资源文件编译及合并
Laravel Elixir 深入探究(二):版本控制、测试套件、任务执行以及自定义任务和扩展
Laravel 5.1中 Redis 的安装配置及基本使用教程
Laravel 5.1 分页功能实现及如何自定义分页样式
Laravel 5.1 中的异常处理器和HTTP异常处理实例教程
基于 Laravel 集成的 Monolog 库对日志进行配置和记录
Laravel 5.1 定义事件、事件监听器以及触发事件实例教程
使用 Laravel 5.1 的文件系统对文件进行存储、移动和删除操作
使用 Laravel 5.1 内置的本地化功能轻松实现多语言支持
在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详细教程
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
Laravel 5.1 测试系列 —— PHPUnit 安装及简单单元测试示例
实战篇
2篇文章
使用 Laravel 纯手工打造一个简单的电子商务网站(一) —— 后台新增商品及前台显示
使用 Laravel 纯手工打造一个简单的电子商务网站(二) —— 用户认证及购物车功能实现
图书
Laravel 5.1 基础教程
服务篇
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
由 学院君 创建于7年前, 最后更新于 2年前
版本号 #2
79213 views
28 likes
0 collects
1、概述
在Web开发中,我们经常会遇到需要批量处理任务的场景,比如群发邮件、秒杀资格获取等,我们将这些耗时或者高并发的操作放到队列中异步执行可以有效缓解系统压力、提高系统响应速度和负载能力。
实现队列有多种方式,Laravel也支持多种队列实现驱动,比如数据库、Redis、Beanstalkd、IronMQ及Amazon SQS等,此外还支持同步方式实现队列(默认),甚至将队列驱动设置为null表示不使用队列。Laravel为这些队列驱动提供了统一的接口,从而方便我们任意切换驱动而不需要改变业务逻辑编码,提供代码复用性。
下面我们将以Redis驱动为例演示在Laravel如何实现队列创建、推送和执行。
2、配置文件
我们仍然从配置文件开始,首先我们需要在配置文件中配置默认队列驱动为Redis,队列配置文件是config/queue.php:
return [
'default' => env('QUEUE_DRIVER', 'sync'),
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'expire' => 60,
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
'ttr' => 60,
],
'sqs' => [
'driver' => 'sqs',
'key' => 'your-public-key',
'secret' => 'your-secret-key',
'queue' => 'your-queue-url',
'region' => 'us-east-1',
],
'iron' => [
'driver' => 'iron',
'host' => 'mq-aws-us-east-1.iron.io',
'token' => 'your-token',
'project' => 'your-project-id',
'queue' => 'your-queue-name',
'encrypt' => true,
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'expire' => 60,
],
],
'failed' => [
'database' => 'mysql', 'table' => 'failed_jobs',
],
];
该配置文件第一个配置项default用于指定默认的队列驱动,这里我们将其值改为redis(实际上是修改.env中的QUEUE_DRIVER)。
connections配置项包含了Laravel支持的所有队列驱动,我们使用Redis驱动,所以需要配置redis项:connection对应config/database.php中redis的default配置;queue为默认队列名称;expire为队列任务过期时间(秒)。这里我们可以保持其默认配置不变。
failed配置项用于配置失败队列任务存放的数据库及数据表。这里我们需要按照自己的数据库配置对其做相应修改。
3、编写队列任务
本例中,我们将演示一个给用户发送新功能提醒邮件的例子。
首先我们通过如下Artisan命令创建任务类:
php artisan make:job SendReminderEmail --queued
--queued选项表示生成的任务类实现了ShouldQueue接口,会被推送到队列而不是同步执行。
运行成功后会在app/Jobs目录下生成一个SendReminderEmail.php,我们修改其内容如下:
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\User;
use Illuminate\Contracts\Mail\Mailer;
class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
use InteractsWithQueue, SerializesModels;
protected $user;
/**
* Create a new job instance.
* @return void
*/
public function __construct(User $user)
$this->user = $user;
/**
* Execute the job.
* @return void
*/
public function handle(Mailer $mailer)
$user = $this->user;
$mailer->send('emails.reminder',['user'=>$user],function($message) use ($user){
$message->to($user->email)->subject('新功能发布');
});
这里我们使用依赖注入引入了User和Mailer实例。User用于获取用户信息,Mailer用于发送邮件。这里的Mailer和前一节邮件发送中使用的Mail门面有异曲同工之效,它们最终调用的都是同一个类上的方法,这个类就是Illuminate\Mail\Mailer。
下面我们创建邮件局部视图resources/views/emails/reminder.blade.php:
亲爱的{{$user->name}},您好,Laravel学院新发布了XXX功能,立即去体验下吧:
前往学院
编写好任务类之后我们来看如何将任务推送到队列中:
4、推送队列任务
手动分发任务
我们可以使用控制器中的DispatchesJobs trait(该trait在控制器基类Controller.php中引入)提供的dispatch方法手动分发任务:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Mail;
use Storage;
use App\User;
use App\Jobs\SendReminderEmail;
class MailController extends Controller
//其他方法
//发送提醒邮件
public function sendReminderEmail(Request $request,$id){
$user = App\User::findOrFail($id);
$this->dispatch(new SendReminderEmail($user));
然后在routes.php中定义路由:
Route::get('mail/sendReminderEmail/{id}','MailController@sendReminderEmail');
运行队列监听器
在浏览器中访问http://laravel.app:8000/mail/sendReminderEmail/1,此时任务被推送到Redis队列中,我们还需要在命令行中运行Artisan命令执行队列中的任务。Laravel为此提供了三种Artisan命令:
queue:work 默认只执行一次队列请求, 当请求执行完成后就终止;
queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止;
queue:work --daemon 同 listen 一样, 只要运行着,就能一直接受请求,不一样的地方是在这个运行模式下,当新的请求到来的时候,不重新加载整个框架,而是直接 fire 动作。能看出来, queue:work --daemon 是最高级的,一般推荐使用这个来处理队列监听。
注:使用 queue:work --daemon ,当更新代码的时候,需要停止,然后重新启动,这样才能把修改的代码应用上。
所以我们接下来在命令行中运行如下命令:
php artisan queue:work --daemon
然后去查看邮箱会收到提醒邮件:
注:要保证任务执行成功,需要确保users表中id为1的记录email是一个有效邮箱。
当然你可以在控制器之外的其它地方使用dispatch分发任务,当然在此之前需要在该类中使用use DispatchesJobs。
推送任务到指定队列
上述操作将队列推送到默认队列,即配置文件中的default,当然你还可以将任务推送到指定队列:
public function sendReminderEmail(Request $request,$id){
$user = App\User::findOrFail($id);
$job = (new SendReminderEmail($user))->onQueue('emails');
$this->dispatch($job);
延迟任务执行
除此之外,Laravel还支持延迟任务执行时间,这里我们指定延迟1分钟执行任务:
public function sendReminderEmail(Request $request,$id){
$user = User::findOrFail($id);
$job = (new SendReminderEmail($user))->delay(60);
$this->dispatch($job);
从请求中分发任务
此外,我们还可以将HTTP请求实例映射到任务中,然后从请求实例中获取参数填充任务类的构造函数,如果请求中不包含该参数,甚至还可以传递额外参数,这可以通过DispatchesJobs trait提供的dispatchFrom方法来实现:
public function sendReminderEmail(Request $request,$id){
$this->dispatchFrom('App\Jobs\SendReminderEmail',$request,['id'=>$id]);
当然我们需要对SendReminderEmail任务类的构造函数做如下修改:
public function __construct($id)
$this->user = User::find($id);
构造函数中的$id就是从额外参数中获取到的。
关于队列任务失败处理请参考Laravel队列文档。
Laravel
请求
Redis
队列
任务
延迟
邮件发送
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详细教程
>> 下一篇:
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
46 条评论
#43
yunfux
评论于 5年前
正在删除评论...
请问学院群:
在config/queue.php中如何配置高优秀级 和 低优先级的两个redis队列? 谢谢
#44
我来自沧海
评论于 5年前
正在删除评论...
Argument 1 passed to Illuminate\Redis\Database::__construct() must be of the type array, null given
您好,学院君,queue.php 文件 的驱动改成了 redis 就报这个错误,laravel4.2怎么解决?
#45
zfs
评论于 4年前
正在删除评论...
laravel的任务队列用着蛮方便的,就是屏蔽了队列实现的底层细节。
#46
mahua
评论于 4年前
正在删除评论...
如何判断队列任务中已经存在此任务,存在则不在形成新的队列任务
#47
没有风筝的线
评论于 4年前
正在删除评论...
我在队列执行过程中再次推送一个任务到其他队列好像并没有执行
#48
樱花树下
评论于 3年前
正在删除评论...
php artisan make:job SendReminderEmail --queued 是什么情况
&lsaquo;
&rsaquo;
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
1、概述
2、配置文件
3、编写队列任务
4、推送队列任务
手动分发任务
运行队列监听器
推送任务到指定队列
延迟任务执行
从请求中分发任务
相关推荐
队列
Laravel 5.1 中文文档
服务
中间件实例教程 —— 中间件的创建使用及中间件参数定义
Laravel 5.1 基础教程
基础篇
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
Laravel 5.1 基础教程
服务篇
队列
Laravel 5.2 中文文档
服务
redis回调
问答
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助