传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题。在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费者作针对性的处理,从而降低系统耦合度,提高系统性能和可用性。
thinkphp-queue 是thinkphp 官方提供的一个消息队列服务,它支持消息队列的一些基本特性:
消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等
队列的多队列, 内存限制 ,启动,停止,守护等
消息队列可降级为同步执行
thinkphp-queue 内置了 Redis,Database,Topthink ,Sync这四种驱动。
一、tp5.1的安装方法
用 composer 安装最新稳定版本
二、添加think-queue扩展
composer安装
配置
配置文件位于项目根目录下的 config/queue.php,添加如下内容:
我配置了redis驱动,大家可以根据自己的情况配置参数。
创建数据库表
创建一张表,用于展示消费队列写入数据库的操作。
创建消息队列任务
以index模块为例,创建一个 /app/index/job/Task.php 文件(job目录也是手动创建,一定要注意的是:TP5.1里面链接数据库一定要用model,否则将会不定期的出现MYSQL链接超时,将会导致supervisor的子进程卡死,自动重启也无效;原因是没能释放连接,也没有找到Db手动释放的方法),代码如下:
入队列(生产任务)
1). 有push()和later()两种方法,前者是立即执行,后者是延迟$delay秒后执行。
2). 调用later()方法,将该任务分配到group1队列里,延迟10秒执行
3). 调用之后,我们通过redis的远程管理工具会发现指定db库的队列里有对应的数据,说明完成了入队列
出队列(消费任务)
在项目根目录执行命令
之后(其中group1为队列名),数据库成功写入一条数据。接下来开始安装和配置supervisor来守护该进程不断的执行任务。
三、supervisor的安装和配置
1.yum安装supervisor
2.配置
1). 在这里我创建了一个命名为supervisor的目录用于存放supervisor和队列的日志文件以及include的配置文件,其目录结构为:
2). 然后找到/etc/supervisord.conf配置文件,编辑如下信息:
3). 在/var/supervisor/conf目录里创建一个.conf文件,这里命名为queue_work.conf,内容如下:
对于index这个单模块而言,不同的业务逻辑为了区分可能会存在多个队列名,这种情况将多个队列名用逗号拼接起来:
4.重启
或
调用方法,成功写入数据库。