传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题。在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费者作针对性的处理,从而降低系统耦合度,提高系统性能和可用性。

  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.重启

  或

  调用方法,成功写入数据库。