laravel 队列 默认队列 和 指定队列的区别

各位php小伙伴们好! 今天来分享一下 laravel 队列 默认队列 和 指定队列的区别。如果你有需要, 可以参考这篇文章,通过队列,你可以将耗时任务 (如发送电子邮件) 的处理往后推延。延迟这些耗时的任务可以极大地提升 web 请求响应速度。。当你有耗时的处理时就可以把这些耗时业务逻辑交给队列,然后给前端返回,剩下的交给队列慢慢去执行。以达到异步执行快速返回的目的。

开始使用

配置文件

laravel 像往常一样,使用任何服务先搞好配置文件
队列的配置 在 config/queue.php 配置文件中
先配置驱动,也就是,你要用什么方式来保存队列任务
就好比你发了工资,你要选择存在银行,支付宝,还是存在微信,

laravel 提供了好多种方式,默认的 sync 同步执行,就是不需要保存队列,就像你的工资一发就花掉没有保存 配置文件
‘default’ => env(‘QUEUE_DRIVER’, ‘sync’),
可以在 env 修改 QUEUE_DRIVER=database 参数成你的方式,我这里是 database 使用数据库来储存,对应的方式要有对应的链接配置,具体参考官方文档

数据库

laravel队列用数据库还是Redis laravel 队列和事件的区别_数据库


很简单,只需要运行这两个命令,一个叫jobs的表就自动创建好了,啥都不用管…

编写队列任务执行代码

然后创建一些队列任务执行类,同样跟简单,运行命令

php artisan make:job Test

laravel队列用数据库还是Redis laravel 队列和事件的区别_php_02


在你的app下多了Job目录和一个 队列执行类,如图

laravel队列用数据库还是Redis laravel 队列和事件的区别_后端_03


你只需要在handle 方法里编写你的业务处理代码即可,

队列,

队列就是把要执行的任务一个一个存进前面你配置的储存驱动,列如我这里的数据库,创建任时就会把任务一条一条的存进之前创建的 jobs表去排队等待被执行,然后启动队列后框架就会自动去读取这些任务交给jobs目录下对应的处理类去执行这些任务,执行完的任务,就会被自动删除,就像银行办理业务排队,办理一个就走一个,其他人接着排队…

创建任务 和 默认队列 与 指定队列的区别

做好前面的一切,终于到了今天这篇文章要分享的重点了,废话真多…

创建任务,就是把要执行的任务丢进数据库,老列子就像银行 领号 排队一样…

在你项目的任何一个需要的地方都可提交队列任务,如新用户注册成功之后需要给他发送一封邮件告诉他默认密码等等…的任何任务,

提交队列任务

方法一,助手函数

use App\Jobs\Test;
// dispatch 的参数是你刚刚创建的任务类 /jobs 目录下的类
   //可以这样写
dispatch(new Test('1111***@qq.com'));

//还可以这样写
$test = new Test('1111***@qq.com');
dispatch($test);

方法二,类调用

// dispatch 的参数是你要传递给任务类的构造函数的参数
 Test::dispatch('1111***@qq.com');

new test类时传递入给构造函数的参数就是你在 handle 方法中处理业务逻辑要用到的参数,可以是字符串,数组、对象等,参数会被自动序列化后保存到数据库的对应任务中,jobs表的payload字段就是储存这些信息,这里不多讲了,任务被执行时会自动反序列化后传入 执行类 的 构造函数,如我截图的Test类。handle 方法中 this 指向便可获得,

new 的哪个类,这个任务就会被那个类去执行,就像银行,你领号的是办理什么业务,之后你就会办理什么业务的窗口叫号

调用了后,数据库jobs表就会多一条等待执行的任务数据,如图:

laravel队列用数据库还是Redis laravel 队列和事件的区别_php_04

默认队列 与 指定队列的区别

默认队列,在上一步创建任务时如果没有指定要加入的对列名,就会被加入默认对列,默认队列名就是 queue.php 配置文件里个配置下的 queue 参数,当然你可以修改它,但是没必要

laravel队列用数据库还是Redis laravel 队列和事件的区别_数据库_05


数据库jobs表有个 queue 字段存的就是队列名称。配置的其他储存驱动也差不多,

就像银行办理业务分为不同的窗口,有专们办卡的,存钱的,取钱的,VIP专用的、综合业务的,不同的队列名称可以理解为就像是不同的窗口,相当于排不同的队伍。不同的处理业务你可以叫不同的的队列名,方便你管理,比如专门发邮件类的队列任务你可以叫 emails ,默认对列就像是银行综合窗口一样,不知道应该排那个队就去排综合窗口。综合窗口处理任何业务

指定队列名称,在创建时加 onQueue 方法就可以了,

//onQueue方法  参数就是你这个任务想要加入的队列的名称,可以是任何字符串
dispatch(new Test('1111***@qq.com'))->onQueue('test');

Test::dispatch('1111***@qq.com')->onQueue('test');

最后,启动这些任务

运行命令

php artisan queue:work

运行这个命令后,命令就会一直执行,一直去读取数据库待执行的任务去执行,往数据库存进去一个就被执行一个,直到手动关闭命令行窗口,或结束命令,当然如果是服务器我们肯定希望它被一直执行,可以采取官方推荐的进程监视器,或后台运行命令的方式,等让命令进程常驻内存运行,不被结束

laravel队列用数据库还是Redis laravel 队列和事件的区别_数据库_06

这里要注意的是,刚才我们说到队列,数据库的 queue 字段,对列队的名字,

当你运行 php artisan queue:work 命令时不指定你要运行的队列名称,那么就只有默认队列会被执行,也就是 queue 字段 等于 default 的任务会被执行,其他的队列都不会被执行,就像银行窗口,该上班了。只有综合窗口的工作员来了,综合窗口排队的人开始办理业务,其他窗口排队的人继续等着,等到工作人员来了才开始办理业务,

启动指定的队列,在命令后加 --queue 参数

php artisan queue:work --queue=test

这样,就会启动 名字叫 test 的队列,test后面可以跟多个队列名,以逗号相隔

php artisan queue:work --queue=test,test2,test3,…

这样被指定的队列就会被启动,其他没被指定队列继续等待,就像银行窗口被叫到号的窗口就可以去办理业务了,没被叫到号的继续等

好了这些基础用法都介绍完了,其他的高级用法我也不熟,我也是新手,待各位自行摸索。同时望大拿们多多留言指教, 以帮助小弟和跟我一样的新人小伙伴们 学习 引路方向 十分感谢!!鞠躬!