兴奋!第一次接触队列这个玩意儿,捋一下思路,附加两个问题(转自本站:月光)

为了避免一些耗时的操作增加响应请求的时间,所以使用队列。

队列的驱动: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 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!