当前位置:

首页 > 编程开发 > ThinkPHP怎么使用think-queue实现redis消息队列

ThinkPHP怎么使用think-queue实现redis消息队列

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-22
正版软件 Windows macOS软件 Linux 数据库管理工具

简单介绍:消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为异步RPC的主要手段之一。大白话:消息队列有两个角色和一个容器,角色分别为生产者(负责发布任务)和消费者(负责执行任务),容器这是用来存放/堆积生产者发布的任务,将发布和执行两个步骤分开且互不影响。消息队列的大致流程为:生产者发布任务存放/堆积在消息队列中,由消费者主动去消息队列中取出任务并执行,先发布的先执行(队列:先进先出)

本文目录

    简单介绍:

    消息队列中间件是大型系统中的重要组件,已经逐渐成为企业系统内部通信的核心手段。它具有松耦合、异步消息、流量削峰、可靠投递、广播、流量控制、最终一致性等一系列功能,已经成为异步RPC的主要手段之一。

    大白话:

    消息队列有两个角色和一个容器,角色分别为生产者(负责发布任务)和消费者(负责执行任务),容器这是用来存放/堆积生产者发布的任务,将发布和执行两个步骤分开且互不影响。

    消息队列的大致流程为:

    生产者发布任务存放/堆积在消息队列中,由消费者主动去消息队列中取出任务并执行,先发布的先执行(队列:先进先出),在没有消费者的情况下任务会堆积在队列中等待被取出执行。

    优点:

    消息队列适用于大并发或者处理时间长并需要批量操作的第三方接口,可用于但不仅限于短信发送、邮件发送、APP推送等,支持跨系统,即本系统发布的消息队列可以由自己或者给其他系统执行任务,同理本系统也可以作为消费者执行自己或者其他系统发布的消息队列任务。


    接下来主要介绍一下 think-queue 的使用

    ThinkPHP的Queue内置了 Redis、Database、Topthink、Sync四种驱动,这里使用的是 Redis,也推荐使用 Redis

    think-queue 队列消息可以进行任务的发布、获取、执行、删除、重新发布、延迟发布、超时控制等操作

    消息队列基本配置

    在 extra 目录下创建 queue.php 配置文件

     'Redis',
        'expire'     => null,   // 任务过期时间,默认为60秒,若要禁用,则设置为 null
        'default'    => 'REDIS_QUEUE',  // 默认的队列名
        'host'       => '127.0.0.1',   // redis 主机ip
        'port'       => 6379,   // redis 端口
        'password'   => '',   // redis 密码
        'select'     => 0,   // 使用哪里一个 db,默认为 db0
        'timeout'    => 0,   // redis 连接的超时时间
        'persistent' => false,   // 是否是长连接];

    至于为什么放在这里,是因为 Queue 源代码默认从 extra 读取 queue 文件获取配置信息,如果想要将配置文件放置其他地方,则需要对应去修改源代码中的默认获取配置

    生产者

    创建一个测试类,写入生产者方法

     rand(0, 99),
                'userName' => '一起摸鱼'
            ];
    
            // 消息队列名
            $queueName = 'testQueue';
    
            // 推入消息队列,注意这里的 ::class 是PHP5.5才有的写法
            $isPushed = Queue::push(TestQueue::class, $data, $queueName);
    		// PHP5.5以下的可以直接写命名空间
            // $isPushed = Queue::push('app\common\queue\TestQueue', $data, $queueName);
            
            if ($isPushed !== false) {
                // 成功之后的业务
                echo '队列加入成功';
            } else {
                // 失败之后的业务
                echo '队列加入失败';
            }
        }}

    消费者

    创建一个 TestQueue 类,用做消费者,执行消息队列中的任务

    doJob($data);
            
            if ($isJobDone) {
                // 消息队列执行成功,删除队列,否则会一直执行
                $job->delete();
            } else {
                // 消息队列执行失败
                // 获取消息队列已经重试了几遍
                $attempts = $job->attempts();
                if ($attempts == 0 || $attempts == 1) {
                    // 重新发布,参数 delay 是延时发布的时间
                    $job->release(2);
                }
            }
        }
    
        // 消息队列执行失败后会自动执行该方法
        public function failed($data)
        {
            Log::error('消息队列达到最大重复执行次数后失败:' . json_encode($data));
        }
    
        // 消息队列执行方法
        public function doJob($data)
        {
            // 具体执行业务
            
            
            $data = json_encode($data);
            echo '消息队列:' . $data;
            // 这里的判断条件以具体业务是否执行成功进行判断
            if ($data) {
                echo "执行成功";
                return true;
            } else {
                echo "执行失败";
                return false;
            }
        }}

    接下来就是启用队列的监听模式了,因为不可能每次一有任务加进来就去手动执行一次队列。队列的监听模式有两种

    项目根目录执行

    php think queue:work --queue 队列名

    但是由于需要,我们还要将消费者挂起守护进程执行,以确保关掉终端还能够启动队列。

    nohup php think queue:listen --queue 队列名 &

    PS:shell中输入exit来退出终端
    PS:shell中输入exit来退出终端
    PS:shell中输入exit来退出终端

    因为在nohup执行成功后直接点关闭程序按钮关闭终端时会断掉该命令所对应的session,导致 nohup 对应的进程被通知需要一起关掉。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 thinkphp
    相关文章 更多
    thinkphp写接口代码的完整开发实例教程
    thinkphp写接口代码的完整开发实例教程

    本教程以ThinkPHP框架为例,通过文章管理API的具体业务场景,详细拆解路由定义、数据验证、控制器逻辑、数据模型操作、统一响应结构与全局异常处理的完整接口开发全流程。

    thinkphp项目部署指南详解服务器部署步骤
    thinkphp项目部署指南详解服务器部署步骤

    详细解析ThinkPHP项目在Linux服务器上的部署步骤,包括环境搭建、文件权限、Nginx配置及常见陷阱,提供可复制的代码示例与例外场景分析。

    php72w redis,docker php7安装php-redis
    php72w redis,docker php7安装php-redis

    在Docker环境下为PHP安装Redis扩展:手动编译需下载源码、安装phpize、配置编译并安装,生成redis.so并在php.d目录新建redis.ini加载,重启PHP-FPM;也可直接yum安装php72w-pecl-redis,免手动编译。

    php 如何配置 redis,php 如何设置redis
    php 如何配置 redis,php 如何设置redis

    配置PHP的Redis扩展:先安装Redis服务,从GitHub下载phpredis源码,用phpize编译安装,修改php.ini添加extension=redis.so,重启php-fpm或Apache,通过phpinfo验证并连接Redis。

    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】
    c++如何将结构体序列化为Redis兼容的RESP协议格式【深度】

    C++结构体无法直接序列化为RESP协议,需手动将字段映射为*N数组嵌套$lenbulkstring形式。整数需转换为字符串并加:前缀,空字符串用$0\r\n,null用$-1\r\n。长度计算需精确到字节数,特别注意二进制安全,同时确保字段顺序与结构体定义一致。

    如何在Golang架构中部署Redict作为高能数据临时存储中转站
    如何在Golang架构中部署Redict作为高能数据临时存储中转站

    Redis作为跨服务临时状态枢纽,需按消息队列、缓存和原子状态三重角色设计。选型用List实现任务分发及延迟重试,Stream用于事件广播与位点回溯。go-redis/v8需配置MinIdleConns、MaxRetries及超时。数据写入应JSON序列化并带type标签、设合理TTL、将关键字段提至顶层。消费通过原子GET+DEL或processedkey

    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制
    TP8.0 高并发下库存超卖?Redis 原子递减结合数据库乐观锁控制

    在高并发秒杀场景下,利用Redis的减库存原子操作预扣减库存拦截超卖请求,再通过数据库乐观锁(版本号与库存校验)确保最终一致性,异常时回滚Redis库存并借助Lua脚本保证原子性,从而有效防止库存超卖。

    为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】
    为什么 TP6.0 模型关联为空?with 预加载与查询作用域的使用【ORM】

    ThinkPHP6.0模型关联返回null的常见原因包括:with闭包遗漏外键和主键字段、嵌套预加载语法不兼容低版本、关联方法内部误用with或field导致数据失控,以及全局作用域与软删除未显式处理。通过检查SQL日志、显式声明关键字段、升级版本或改用正确语法、清理关联方法中的查询条件即可解决。

    TP6.0 构建支持断点续传的超大附件上传服务【分片】
    TP6.0 构建支持断点续传的超大附件上传服务【分片】

    在ThinkPHP6.0中实现支持断点续传的超大附件上传,采用分片上传方案。前端按2MB切片并生成唯一chunkId,通过GET请求校验已传分片,用localStorage持久化上传状态。后端控制器接收分片存储,创建upload_status表管理进度,合并时加文件锁并校验MD5,确保生产环境下的可靠性与性能。

    thinkphp排序怎么实现动态排序 开发技巧解析
    thinkphp排序怎么实现动态排序 开发技巧解析

    动态排序时,order()应置于查询链式调用中且必须在paginate()之前;字段和方向需通过白名单硬校验,使用数组语法防SQL注入;分页调用appends()传递参数;多字段排序用关联数组,确保安全稳定。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?