兴奋!第一次接触队列这个玩意儿,捋一下思路,附加两个问题(转自本站:月光)
为了避免一些耗时的操作增加响应请求的时间,所以使用队列。
队列的驱动:Redis
使用队列的方式有好几种,Redis 是其中一个。
在 Laravel 中使用 Redis 有两种方式,predis 是其中一个,需要安装扩展包:
composer require "predis/predis:~1.0"
然后在 .env 配置文件中将驱动方式改为 redis:
// 若值为 sync 为不使用队列
QUEUE_DRIVER=redis
生成队列所需的表
执行队列任务的时候可能会失败,失败的任务相关信息会记录在这张表里,以方便再次执行。
使用命令创建迁移文件,执行迁移:
php artisan queue:failed-table
php artisan migrate
生成任务类
任务是队列存在的原因,任务里应该写那些需要耗时的操作。
生成任务类:
php artisan make:job ExampleJob
生成的类文件在 app/jobs
目录下,包含两个方法:
__construct()
用来初始化一些handle()
方法需要用到的参数。handle()
用来真正处理那些耗时的操作。
在这个方法中应该使用 DB 类直接对数据库进行操作,以避免如果有模型监听器的情况下,造成死循环的问题。
任务分发
任务分发就是把任务推送到队列中去等待执行。
在需要执行耗时操作的地方,使用 dispatch(new ExampleJob())
推送到队列中。
队列监控
队列监控可以清楚地查看任务的状态等相关信息,Laravel 生态中的一员 Horizon 可以很好地完成这项任务(不明白这里取名 Horizon 有什么涵义,如果是翻译的话应该是表达什么意思呢?)。
安装:
composer require "laravel/horizon:~1.0"
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
启用监听和停止监听:
php artisan horizon
php artisan horizon:terminate
安装完成并启用监听后,路由 horizon
就可以访问了(查看了路由文件和控制器等没有发现添加这个路由,Laravel 真的好强好优雅,水平有限,现在怀疑是在某些深的层次里直接附带了这一块?)。
在测试的时候还发现这个页面还是热加载的,太贴心了。
在更新了逻辑代码以后最好重启一下监听进程。(因为我特意测试了一下不重启也可以,但从评论里得知可能会造成某些问题。)
线上部署
Supervisor 是一个用 Python 开发的 Linux 下的进程管理器,它会在监测到监听的进程关闭后自动重启。
官网: supervisord.org/
Github: github.com/Supervisor/supervisor
用到了再学习吧。
本作品采用《CC 协议》,转载必须注明作者和本文链接
predis/predis不太好吧,还是安装Redis 扩展更好,原生C 语言实现的,执行效率上比纯 PHP 的 Predis 要高很多。
确实可以考虑一下安装redis拓展
代码变动就必须重启,不然会出各种幺蛾子。