在laravel中,队列是一种操作受限制的线性表,它只允许在表的前端(队头)进行删除操作,而在表的后端(队尾)进行插入操作;通过队列,开发者可以将耗时任务的处理往后推延,进而可以极大地提升web请求响应速度。

本教程操作环境:windows7系统、Laravel6版、Dell G3电脑。
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 命令启动,将一直保持运行,直到它被手动停止或你关闭你的终端:
序列猴子开放平台
具有长序列、多模态、单模型、大数据等特点的超大规模语言模型
0 查看详情
php artisan queue:work
php artisan queue:work –once 添加参数,消费指定队列
#消费qq队列php artisan queue:work --queue=qq
可以看到数据库中新增了两条数据,并且redis中数据被消费


我们再次执行路由

7、事件队列
队列通常是用来处理延迟任务,事件是业务逻辑处理。Laravel 中的 事件 触发器分发至队列中进行异步业务处理,那么这样之后可以快速做出响应而不用实时等待执行结果之后才能给使用者做出提示消息。
如果需要把事件中的业务存放到队列中去,我们并不需要重新进行队列的分发,直接在对应的监听器中实现 IlluminateContractsQueueShouldQueue 接口即可。
创建事件和监听器
php artisan make:event TestEventphp 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

【相关推荐:laravel视频教程】
以上就是laravel 队列是什么的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/227490.html
微信扫一扫
支付宝扫一扫