Laravel中的队列
一、前言
并发处理这块一直是PHP的短板,于是乎就有了并发的另外一种替代方案:队列。队列就是为了在某种程度上替代多线程而设计的一种处理并发的方式,同时,也就具备天生的秉性:异步!用于处理耗时的工作。
二、Laravel中的队列
1、概述
实现队列有多种方式,Laravel也支持多种队列实现驱动,比如数据库、Redis、Beanstalkd、IronMQ及Amazon SQS等,此外还支持同步方式实现队列(默认),甚至将队列驱动设置为null表示不使用队列。Laravel为这些队列驱动提供了统一的接口,从而方便我们任意切换驱动而不需要改变业务逻辑编码,提供代码复用性。
其实说白了,就是把任务的键名和键值储存起来而已,储存的媒介用什么都可以,而所谓的队列驱动,就是把储存在这些媒介中的任务代码拿出来按照队列的算法进行执行的一种调配方式的一段代码而已。
2、配置
从配置文件开始,首先我们需要在配置文件中配置默认队列驱动为Redis,队列配置文件是config/queue.php。
connections配置项:包含了Laravel支持的所有队列驱动。
failed配置项:用于配置失败队列任务存放的数据库及数据表。这里我们需要按照自己的数据库配置对其做相应修改。
说明:该配置文件第一个配置项default用于指定默认的队列驱动,这里可以更改为我们选用的其他队列驱动(实际上是修改.env中的QUEUE_DRIVER)
如下图:
3、创建任务类
通过如下Artisan命令创建任务类:
php artisan make:job CancelTimeoutOrder
4、分发任务
我们可以使用控制器中的DispatchesJobs trait(该trait在控制器基类Controller.php中引入)提供的dispatch方法手动分发任务:
5、开启队列
我们还需要在命令行中运行Artisan命令执行队列中的任务。Laravel为此提供了三种Artisan命令:
1)queue:work 默认只执行一次队列请求, 当请求执行完成后就终止
2)queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止;
3)queue:work --daemon 同listen一样, 只要运行着,就能一直接受请求,不一样的地方是在这个运行模式下,当新的请求到来的时候,不重新加载整个框架,而是直接 fire 动作。能看出来, queue:work --daemon 是最高级的,一般推荐使用这个来处理队列监听
注:使用 queue:work --daemon ,当更新代码的时候,需要停止,然后重新启动,这样才能把修改的代码应用上。
php artisan queue:work --daemon
6、测试
以上就是一个简单的队列使用,那么,如何在一个链接中使用多个队列?
我们不可能将所有任务都放在一个叫default的队列中,这样不容易对队列进行管理。要指定不同的队列,非常简单,在dispatch()后紧接着跟上onQueue()方法即可:
Demo::dispatch()->onQueue('orders');
需要做出一点改动的是,在queue.php配置文件中的redis配置queue从default改为{default},这样做的效果就是队列的名称可以从运行的时候动态拿到,而不是写死的。
$job =new XXXJob();dispatch($job->onQueue('queue-name'));
当我们在开启队列的时候:
php artisan queue:work --queue=orders
这里指定的队列名 orders 和dispatch时指定的队列名保持一致即可。
参考链接:https://www.jianshu.com/p/eb047c297e69