一文教你ThinkPHP使用think-queue实现redis消息队列

发布时间 - 2022-06-28 00:00:00    点击率:

本篇文章给大家带来了关于thinkphp的相关知识,其中主要整理了使用think-queue实现redis消息队列的相关问题,下面一起来看一下,希望对大家有帮助。

推荐学习:《PHP视频教程》

简单介绍:

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

运行结果

请求接口,生产者发布任务


redis 队列存放任务

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

项目根目录执行

php think queue:work --queue 队列名

开启消费者,执行任务

redis 队列中的任务执行后也被删除

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

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

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

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

至此,整个消息队列流程就结束了。

推荐学习:《PHP视频教程》


# thinkphp  # php  # 中间件  # Session  # 接口  #   # 并发  # 异步  # database  # redis  # rpc  # 本系统  # 创建一个  # 配置文件  # 源代码  # 的是  # 默认为  # 这是  # 是因为  # 放在  # 不可能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Thinkphp 中 distinct 的用法解析  phpredis提高消息队列的实时性方法(推荐)  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  如何用AI帮你把自己的生活经历写成一个有趣的故事?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  桂林网站制作公司有哪些,桂林马拉松怎么报名?  jQuery validate插件功能与用法详解  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  公司网站制作价格怎么算,公司办个官网需要多少钱?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Python3.6正式版新特性预览  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel如何升级到最新版本?(升级指南和步骤)  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  网站建设保证美观性,需要考虑的几点问题!  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Android利用动画实现背景逐渐变暗  微信小程序制作网站有哪些,微信小程序需要做网站吗?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何在Windows虚拟主机上快速搭建网站?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  javascript中对象的定义、使用以及对象和原型链操作小结  Laravel如何记录自定义日志?(Log频道配置)  如何在七牛云存储上搭建网站并设置自定义域名?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何在服务器上三步完成建站并提升流量?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel定时任务怎么设置_Laravel Crontab调度器配置  如何用免费手机建站系统零基础打造专业网站?  如何用VPS主机快速搭建个人网站?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Java解压缩zip - 解压缩多个文件或文件夹实例  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  微信小程序 canvas开发实例及注意事项  iOS正则表达式验证手机号、邮箱、身份证号等  如何在云服务器上快速搭建个人网站?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  海南网站制作公司有哪些,海口网是哪家的?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】