兴奋!第一次接触队列这个玩意儿,捋一下思路,附加两个问题
43

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

队列的驱动: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 下的进程管理器,它会在监测到监听的进程关闭后自动重启。

官网: http://supervisord.org/
Github: https://github.com/Supervisor/supervisor

用到了再学习吧。

勤学如春起之苗,不见其增,日有所长。

本帖已被设为精华帖!
本帖由系统于 4个月前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 5
Summer

总结是个不错的习惯,不过别发到『问题』分类下,可以发到自己的博客文章里。

5个月前
Soldoros

@Summer 知道了,老大

5个月前

php 没有异步非阻塞,确实不爽。比如发通知,写日志,调异步加快速度。golang 只需要go一下就好,加个超时回收协程。

5个月前
Soldoros

@xuanjiang1985 swoole 了解一下?

5个月前

@Soldoros swoole 总觉得用起来不爽

4个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!