[笔记] 关于任务队列在项目中的使用
本文总结来自 Web开发实战进阶:使用队列
什么时候使用队列
处理一个需求中,属于优化而非必须的功能时,可以使用队列来完成。
队列允许你异步执行消耗时间的任务,这样可以有效降低请求响应的时间。
1. 配置队列
队列的配置信息保存在 config/queue.php
中。
队列的驱动包括:数据库、Beanstalkd、Amazon SQS、Redis 和同步(本地使用)的驱动。声明为 null
时表示不使用队列任务。
本次教程中,使用 Redis 作为队列驱动,需要先安装相关依赖:
$ composer require "predis/predis:~1.0"
然后修改 .env
文件中的环境变量 QUEUE_DRIVER
的值为 redis
失败任务
队列任务执行失败后,会进行重试,当重试次数超过指定的任务重试最大次数后,会将失败的任务信息写入 failed_jobs
表中。使用 php artisan queue:failed-table
指令来创建 failed_jobs
表的迁移文件,随后执行迁移。
$ php artisan queue:failed-table
$ php artisan migrate
2. 生成任务类
使用 make:job
Artisan 指令来创建一个新的队列任务,该指令会在 app/Jobs
下生成一个新的类
$ php artisan make:job JobName
该类会实现 Illuminate\Contracts\Queue\ShouldQueue
接口,该接口表明 Laravel 应该将任务添加到后台的任务队列中,而非同步执行。
引入 SerializesModels
trait, Eloquent 模型会被优雅的序列化和反序列化。construct
将会序列化模型ID,执行任务时,会从数据库中根据 ID 检索出模型实例。handle
方法将在任务执行时被调用。且为了避免出现模型监控器的死循环,我们要使用 DB
类直接对数据库进行操作。
3. 任务分发
使用 dispatch
方法,可以将任务推送到队列。
4. 队列监控 Horizon
Horizon 是 Laravel 生态圈里的一员,为 Laravel Redis 队列提供了一个漂亮的仪表板,允许我们很方便地查看和管理 Redis 队列任务执行的情况。
使用 composer 安装:
$ composer require "laravel/horizon:~1.0"
安装完成后,使用 vendor:publish
Artisan 命令发布配置文件 config/horizon.php
和存放在 public/vendor/horizon
文件夹中的CSS、JS 等页面资源文件。
$ php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
使用指令 php artisan horizon
即可监控队列任务的执行,浏览器中打开 http://larabbs.test/horizon 即可通过可视化界面监控队列任务的状态。
线上部署
在生产环境使用队列需要注意以下两个问题:
-
使用 Supervisor 进程工具进行监控
php artisan horizon
指令的执行,以便进程意外退出时能自动重启,配置和使用参照 Horizon文档 -
每一次部署代码时,需先执行 artisan horizon:terminate 然后再执行 artisan horizon 重新加载代码。
本作品采用《CC 协议》,转载必须注明作者和本文链接