使用场景:处理一些耗时或者高并发的操作,把操作放到队列中异步执行,可以有效缓解系统压力、提高系 统响应速度和负载能力。常见的场景有群发邮件或秒杀等等。Laravel支持多种队列实现的驱动,本文主要以Redis进行说明。
一、安装Redis驱动
修改composer.json文件,如下:
"require": {
"php":">=5.6.4",
"laravel/framework":"5.4.*",
"laravel/tinker":"~1.0",
"predis/predis":"1.0.*",
"dingo/api":"1.0.*@dev",
},
执行composer update即可完成安装
二、配置Redis的连接
修改.env文件,如下:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=1234qwer
REDIS_PORT=6379
三、修改默认的队列驱动
修改.env文件,如下:
QUEUE_DRIVER=redis
四、编写任务类
php artisan make:job QueueDemo
五、其他
最大失败次数设置,在任务类增加属性:
public $tries=5;
超时设置,在任务类增加属性【队列任务最大运行时长(秒)】:
public $timeout=120;
timeout 与 retry_after的区别查看地址
六、分发任务
分发任务到指定的 连接与队列
dispatch(new DemoQueue('李四'))->onConnection('redis')->onQueue('exam');
分发任务到指定的队列
dispatch(new DemoQueue('李四'))->onQueue('exam');
七、运行队列监听器
指定 连接&队列
php artisan queue:work redis --queue=exam
注意:队列进程开始运行后,会持续监听队列,直至你手动停止或关闭终端;为了保持队列进程queue:work持续在后台运行,需要使用进程守护程序,比如Supervisor来确保队列进程持续运行。队列进程是长生命周期的进程,会在启动后驻留内存。若应用有任何改动将不会影响到已经启动的进程。所以请在发布程序后,重启队列进程。
八、其他
进行休眠时间
当任务在队列中有效时,进程会持续处理任务,没有延迟。不过,我们可以使用sleep配置项来指定没有新的有效任务产生时的休眠时间:
php artisan queue:work –sleep=3