总结要点:使用队列,监控队列
队列
使用队列可以异步执行消耗时间的任务,降低请求响应时间
配置队列
- 队列配置信息文件
config/queue.php
- 其中包含了所支持的队列驱动
- 在
.env
中修改所配置的队列驱动QUEUE_DRIVER
- 配置失败任务的记录
- 创建数据库表
php artisan queue:failed-table
- 创建数据库表
生成任务类
- 创建任务类
php artisan make:job QueueJob
- 生成的文件位于
app/Jobs
- 配置任务类
_construct
构建方法中,注入所需要的模型handler
方法中,开始你的任务
若任务涉及到了数据库的读写,需要注意
数据库的读写直接使用DB
类,而不是使用 ORM
因为一般我们会在模型监听器中分发队列任务,此时,会形成一个死循环
通过 ORM 写数据库,触发 ORM 监听器 -> 分发队列任务 -> 任务中使用了 ORM 写数据库 -> 通过 ORM 写数据库,触发 ORM 监听器 -> ….
分发任务
- 在模型监听器中调用
dispatch(new QueueJob($aModel))
需要注意
当创建数据时启用了队列任务时,需要在saved
监听方法中分发任务
若在saving
中分发任务,任务运行时通过数据 ID 寻找数据时可能会出错,因为saving
的时候,数据还没有写到数据库
队列监控
- 使用 Laravel 自带的
php artisan queue:listen
- 只有命令行界面的输出
- 使用 Horizon
- Horizon 是 Laravel 的一员,提供友好的界面监控
使用 Horizon
安装
composer require "laravel/horizon:~1.0"
配置
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
访问 Web 页面
http://project.test/horizon
启动监控
php artisan horizon
本作品采用《CC 协议》,转载必须注明作者和本文链接
这句我没理解,有没有具体的
case
讲一下?另外就是我比较关心楼主的
QUEUE_DRIVER
如何配置?如果是redis
的话,遇到集群分片的情况是怎么处理的?