队列
Laravel5 使用队列可以异步执行消耗时间的任务,降低请求的响应时间
安装队列驱动
- 根据你自己的需求安装对应的队列驱动
composer require "predis/predis:~1.1"
关于配置队列
- 队列配置信息文件
config/queue.php
其中包含所有支持的队列驱动
.
.
'redis' => [
'driver' => 'redis',// 队列驱动类型
'connection' => 'default',
// 默认队列名称 default,若有多个job最好命名互相不一致
'queue' => env('REDIS_QUEUE', 'default'),
// 如果retry_after 设定的值为 90, 任务在运行 90 秒后还未完成,那么将被释放回队列而不是删除掉。
'retry_after' => 90,
// redis 节点
'block_for' => null,
],
.
.
# 队列执行失败配置参数
'failed' => [
# 队列保存失败 链接数据库默认mysql
'database' => env('DB_CONNECTION', 'mysql'),
# 队列保存失败 保存数据库表 failed_jobs 中
'table' => 'failed_jobs',
],
- 在
.env
中修改所配置的驱动QUEUE_CONNECTION
的值
QUEUE_CONNECTION=redis
-
使用队列也会有失败,故需要配置失败任务的表
php artisan queue:failed-table
生成任务类
-
创建任务
- 运行命令行
php artisan make:job QueueJob
- 将会生成新文件置于
app/Jobs/QueueJob.php
- 运行命令行
-
配置任务
app/Jobs/QueueJob.php
-
__construct
初始化方法注入对应模型
请根据自己的模型名称自行替换 Model $model 此模型名称对应下文的:某模型监听器(app/Observers/某模型监听器文件.php) 的 Model public function __construct(Model $model) { // 队列任务构造器中接收了 Eloquent 模型,将会只序列化模型的 ID $this->model = $model; }
-
handler
方法中执行任务所需code
public function handle() { // 执行code... /* * 此处注意点: * * 若任务code 涉及到数据库的读写操作,需要将使用 ORM 模型对数据库的读写操作,使用 DB 类代替 * * 若不使用 DB 类对数据库读写,将会陷入调用死循环 * 因为一般会在 `模型监听器` 中分发队列任务 * * 模型监控器(app/Observers/某模型监听器文件.php)分发任务(app/Jobs/Queue.php) -> * 任务(app/Jobs/Queue.php)触发模型监控器(app/Observers/某模型监听器文件.php) -> * 模型监控器再次分发任务 -> * 任务再次触发模型监控器 ->... */ }
分发任务
-
在模型监听器中调用
dispatch(new QueueJob($model))
某模型监听器(app/Observers/某模型监听器文件.php) 中
注意点: 当创建数据时启用了队列任务的时候,需要在 `saved` 监听方法中分发任务 public function saved(Model $model) { // 推送任务到队列 dispatch(new QueueJob($model)); }
- 若在
saving()
中分发任务,任务运行时通过数据ID 查找数据会出错,此时saving()
还未将数据写入数据库
- 若在
关于队列监控
可使用 Laravel 自带的
php artisan queue:listen
监控队列任务或安装队列监控 Horizon,拥有友好界面监控
安装 Horizon
composer require "laravel/horizon:~1.0"
- 发布相关文件
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
- 访问 Horizon 控制台
http://yourProject.com/horizon
- Horizon 是监控程序,需要常驻运行
- artisan horizon 队列工作的守护进程是一个常驻进程.
- 它不会在你的代码改变时进行重启,
当修改代码以后,
需要在命令行中对其进行重启操作。
php artisan horizon
-
artisan horizon
线上部署时需另行配置进程管理工具来监控- Supervisor 进程工具可进行管理
上面讲述到 `artisan horizon` 是不会再修改代码后自动重启。
当需要终止当前 `Horizon` 主进程,则需要通过进程工具来重启。