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

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

队列的驱动: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

用到了再学习吧。

小时候,幸福是一件很简单的事;长大了,简单是一件很幸福的事。
本帖已被设为精华帖!
本帖由系统于 5年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
Summer

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

5年前 评论

@Soldoros swoole 总觉得用起来不爽

5年前 评论
月光

@Summer 知道了,老大

5年前 评论

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

5年前 评论
月光

@xuanjiang1985 swoole 了解一下?

5年前 评论

我是来看问题的,结果看了三遍没发现问题,兄弟,你骗我

5年前 评论
月光

@xuelong 括号里的就是问题,一个是那个名字如何翻译,如果理解呢?第二个问题是路由的那个,现在已经解决了。

5年前 评论

在更新了逻辑代码以后最好重启一下监听进程。(因为我特意测试了一下不重启也可以,但从评论里得知可能会造成某些问题。)

      真的假的, 为什么我不 重启就不行呢??????
2年前 评论

好像真的可以。

2年前 评论

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