今天小编给大家分享一下laravel队列怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
在laravel中,队列是一种操作受限制的线性表,它只允许在表的前端(队头)进行删除操作,而在表的后端(队尾)进行插入操作;通过队列,开发者可以将耗时任务的处理往后推延,进而可以极大地提升web请求响应速度。
laravel中队列的使用
1、什么是队列
队列是一种操作受限制的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。
通过队列,你可以将耗时任务 (如发送电子邮件) 的处理往后推延。延迟这些耗时的任务可以极大地提升 web 请求响应速度。
2、优点
解耦:消息队列可以对系统进行解耦,提高响应速度,系统功能向内聚合,对外开放;
异步:消息队列可以对系统异步功能进行剥离,减少功能耦合,提供开发效率;
削峰:消息队列可以削峰限流,确保下游消费者稳定运行;
3、配置
队列配置文件存储在 config/queue.php 中。 在这个文件中,你可以找到框架中包含的每个队列驱动程序的连接配置,其中包括数据库,Beanstalkd,Amazon SQS,Redis,和一个同步驱动程序(sync-供本地使用)。
这里使用 Redis 作为驱动,需要安装好 Redis 以及 相关扩展。
4、任务
我们需要把一些东西放入队列中,我们可以称之为任务。Laravel 框架中创建任务给我们提供了以下命令:
php artisan make:job TestJob
TestJob.php
namespace AppJobs;use IlluminateBusQueueable;use IlluminateContractsQueueShouldBeUnique;use IlluminateContractsQueueShouldQueue;use IlluminateFoundationBusDispatchable;use IlluminateQueueInteractsWithQueue;use IlluminateQueueSerializesModels;use IlluminateSupportFacadesDB;use SymfonyPolyfillIntlIdnInfo;class TestJob implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() {// Log::info('hhh'); DB::connection('test') ->table('master') ->insert([ 'name'=>'小白', 'email'=>'123@qq.com' ]); }}
5、分发
一旦编写了任务类,就可以使用任务本身的 dispatch 方法来分派它。传递给 dispatch 方法的参数将被传递给任务的构造函数。
onQueue: 指定队列;
onConnection: 指定连接;
delay: 延迟队列;
dispatchNow: 同步调度;
#在路由中简单调用 Route::get('queue',function(){ AppJobsTestJob::dispatch(); // AppJobsTestJob::dispatch()->onQueue('qq'); });
运行两次该路由可以看到生成一个名为qq的队列,后面我们对队列进行消费
6、队列消费
Laravel 有一个队列处理器对新推入队列的任务进行处理。通过 Artisan 命令 queue:work 来启动队列处理器。需要注意的是,一旦 queue:work 命令启动,将一直保持运行,直到它被手动停止或你关闭你的终端:
php artisan queue:work
php artisan queue:work --once 添加参数,消费指定队列
#消费qq队列 php artisan queue:work --queue=qq
可以看到数据库中新增了两条数据,并且redis中数据被消费
我们再次执行路由
7、事件队列
队列通常是用来处理延迟任务,事件是业务逻辑处理。Laravel 中的 事件 触发器分发至队列中进行异步业务处理,那么这样之后可以快速做出响应而不用实时等待执行结果之后才能给使用者做出提示消息。
如果需要把事件中的业务存放到队列中去,我们并不需要重新进行队列的分发,直接在对应的监听器中实现 IlluminateContractsQueueShouldQueue 接口即可。
创建事件和监听器
php artisan make:event TestEvent php artisan make:listener TestListener
在appprovidersEventServiceProvider.php中注册
TestListener.php
namespace AppListeners; use IlluminateContractsQueueShouldQueue; use IlluminateQueueInteractsWithQueue; use IlluminateSupportFacadesDB; class TestListener implements ShouldQueue { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param object $event * @return void */ public function handle() { DB::connection('test') ->table('master') ->insert([ 'name'=>'小黑', 'email'=>'234@qq.com' ]); } }
修改路由
Route::get('queue',function(){ //AppJobsTestJob::dispatch(); //指定队列名称 //AppJobsTestJob::dispatch()->onQueue('qq'); return event(new AppEventsTestEvent()); });
运行路由
消费队列
php artisan queue:work