• think-queue安装与使用


    官方介绍(可忽略)

    think-queue是ThinkPHP官方提供的一个消息队列服务,是专门支持队列服务的扩展包。think-queue消息队列适用于大并发或返回结果时间比较长且需要批量操作的第三方接口,可用于短信发送、邮件发送、APP推送。think-queue消息队列可进行发布、获取、执行、删除、重发、失败处理、延迟执行、超时控制等操作。

    think-queue支持消息队列的基本特性

    • 消息的发布、获取、执行、删除、重发、失败处理、延迟执行、超时控制等
    • 队列的多队列、内存限制、启动、停止、守护等
    • 消息队列可降级位同步执行

    官方文档


    版本

    think-queue各主版本对应适用的ThinkPHP版本

    think-queue版本号适用的ThinkPHP版本
    1.xThinkPHP5.0
    2.xThinkPHP5.1
    3.xThinkPHP6.0

    安装

    1. 下载地址(GitHub | Composer

    2. 使用Composer快速安装Think-queue

    composer require topthink/think-queue
    
    • 1

    搭建消息队列的存储环境


    配置

    1. think-queue安装完成后,找到项目配置目录下生成的配置文件config/queue.php

    配置文件

    1. 打开并修改配置文件

    默认的驱动类型sync更改为redis,使用前者的发布任务的只会同步执行,推荐使用redis。使用redis驱动类型,需要事先安装好Redis服务,详见 《Redis安装与使用》

    配置内容

    公共配置

    [
        'default'=>'sync' //驱动类型,可选择 sync(默认):同步执行,database:数据库驱动,redis:Redis驱动//或其他自定义的完整的类名
    ]
    
    • 1
    • 2
    • 3

    驱动类型

    驱动类型对应的类型值
    sync同步执行, 默认值
    database数据库驱动
    redisRedis驱动 【推荐】
    其他自定义的完整的类名···

    创建任务类

    单模块项目推荐使用app\job作为任务类的命名空间,多模块项目可用使用app\module\job作为任务类的命名空间,也可以放在任意可以自动加载到的地方

    • 任务类不需继承任何类,如果这个类只有一个任务,那么就只需要提供一个fire方法就可以了,如果有多个小任务,就写多个方法,下面发布任务的时候会有区别

    • 每个方法会传入两个参数think\queue\Job $job(当前的任务对象)和$data(发布任务时自定义的数据)

    • 还有个可选的任务失败执行的方法failed传入的参数为$data(发布任务时自定义的数据)

    单任务的类

    namespace app\job;
    
    use think\queue\Job;
    
    class Job1
    {
        public function fire(Job $job, $data)
        {
            //....这里执行具体的任务 
                
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
            }
                
            //如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法
            $job->delete();
                
            // 也可以重新发布这个任务
            $job->release($delay); //$delay为延迟时间
        }
        
        public function failed($data)
        {
            // ...任务达到最大重试次数后,失败了
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    多任务的类

    namespace app\lib\job;
    
    use think\queue\Job;
    
    class Job2
    {
        public function task1(Job $job, $data)
        {
        
        }
        
        public function task2(Job $job, $data)
        {
            
        }
        
        public function failed($data)
        {
             
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    发布任务

    think\facade\Queue::push($job, $data = '', $queue = null)think\facade\Queue::later($delay, $job, $data = '', $queue = null)两个方法,前者是立即执行,后者是在$delay秒后执行

    $job是任务名

    • 单模块的,且命名空间是app\job的,比如上面的例子一,写Job1类名即可
    • 多模块的,且命名空间是app\module\job的,写model/Job1即可
    • 其他的需要些完整的类名,比如上面的例子二,需要写完整的类名app\lib\job\Job2
    • 如果一个任务类里有多个小任务的话,需要用@+方法名,如app\lib\job\Job2@task1app\lib\job\Job2@task2

    $data是你要传到任务里的参数

    $queue队列名,指定这个任务是在哪个队列上执行,同下面监控队列的时候指定的队列名,可不填


    监听任务并执行

    > php think queue:listen
    
    > php think queue:work
    
    • 1
    • 2
    • 3

    两种,具体的可选参数可以输入命令加--help查看


    设置常驻进程

    使用Supervisor,保证进程常驻

    php think queue:listen --queue testQueue
    
    • 1

    设置常驻进程


    参考资料:

    TP6.0 消息队列 topthink/think-queue

    thinkphp-queue 笔记

  • 相关阅读:
    Vue3 按需引入 Element Plus
    部署kubevirt教程
    【云原生】-Docker安装部署分布式数据库 OceanBase
    R语言data.table包进行数据分组聚合统计变换(Aggregating transforms)、计算dataframe数据的分组标准差(sd)
    Github 2024-04-24 C开源项目日报 Top9
    机器学习实战:基于sklearn的工业蒸汽量预测
    Elasticsearch:从 ES|QL 到 PHP 对象
    Vue3 基础 – 快速上手 & 常用指令
    计算机毕业设计 基于SSM+Vue的志愿者招募网站的设计与实现 Java实战项目 附源码+文档+视频讲解
    UVM中callback的使用
  • 原文地址:https://blog.csdn.net/Hiking_Tsang/article/details/127617177