zoukankan      html  css  js  c++  java
  • TP6 基于 redis 实现消息队列和延迟队列

    think-queue 安装

    composer require topthink/think-queue

    我们需要在安装好的 think-queue > src 下找到 config.php 复制里面的内容,然后在根目录下 config 目录下创建 queue.php文件,将复制的内容粘贴进去
    <?php
    /**
     * 消息队列配置
     */
    
    
    return [
        'default'     => 'redis',
        'connections' => [
            'sync'     => [
                'type' => 'sync',
            ],
            'database' => [
                'type'       => 'database',
                'queue'      => 'default',
                'table'      => 'jobs',
                'connection' => null,
            ],
            'redis'    => [
                'type'       => 'redis',
                'queue'      => 'default',
                'host'       => env('redis.host', '127.0.0.1'),
                'port'       => env('redis.port', 6379),
                'password'   => env('redis.password', ''),
                'select'     => 0,
                'timeout'    => 0,
                'persistent' => false,
            ],
        ],
        'failed'      => [
            'type'  => 'none',
            'table' => 'failed_jobs',
        ],
    ];
    

      创建一个生产者

    <?php
    namespace appapicontroller;
    
    use appBaseController;
    use thinkfacadeQueue;
    
    class Index extends BaseController
    {
        public function index()
        {
            // echo phpinfo();exit();
            // 1.当前任务由哪个类来负责处理
            // 当轮到该任务时,系统将生成该类的实例,并调用其fire方法
            $jobHandlerClassName = 'appapicontrollerJob1';
    
            // 2.当任务归属的队列名称,如果为新队列,会自动创建
            $jobQueueName = "helloJobQueue";
    
            // 3.当前任务所需业务数据,不能为resource类型,其他类型最终将转化为json形式的字符串
            $jobData = ['ts' => time(), 'bizId' => uniqid(), 'a' => 1];
    
            // 4.将该任务推送到消息列表,等待对应的消费者去执行
            // 入队列,later延迟执行,单位秒,push立即执行
            $isPushed = Queue::later(10, $jobHandlerClassName, $jobData, $jobQueueName);
    
            // database 驱动时,返回值为 1|false  ;   redis 驱动时,返回值为 随机字符串|false
            if ($isPushed !== false) {
                echo '推送成功';
            } else {
                echo '推送失败';
            }
        }
    }
    

      创建一个消费者

    <?php
    namespace appapicontroller;
    
    use thinkfacadeLog;
    use thinkqueueJob;
    
    class Job1
    {
        /**
         * fire方法是消息队列默认调用的方法
         * @param Job $job 当前的任务对象
         * @param array $data 发布任务时自定义的数据
         */
        public function fire(Job $job, array $data)
        {
            // 有些任务在到达消费者时,可能已经不再需要执行了
            $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
            if (!$isJobStillNeedToBeDone) {
                $job->delete();
                return;
            }
    
    
            $isJobDone = $this->doHelloJob($data);
            if ($isJobDone){
                $job->delete();
                echo "删除任务" . $job->attempts() . '
    ';
            }else{
                if ($job->attempts() > 3){
                    $job->delete();
                    echo "超时任务删除" . $job->attempts() . '
    ';
                }
            }
    
        }
    
        /**
         * 有些消息在到达消费者时,可能已经不再需要执行了
         * @param array $data
         * @return bool
         */
        private function checkDatabaseToSeeIfJobNeedToBeDone(array $data) {
            return true;
        }
    
        /**
         * 根据消息中的数据进行实际的业务处理...
         * @param array $data
         * @return bool
         */
        private function doHelloJob(array $data)
        {
            echo '执行业务逻辑:' . $data['bizId'] . '
    ';
    
            return true;
        }
    }
    

      

    监听任务并执行

    php think queue:listen

    php think queue:work

    参考链接:(13条消息) ThinkPHP6+Redis+think-queue+Supervisor实现进程常驻消息队列_lxfdmwin的博客-CSDN博客_thinkphp6 消息队列

    【消息队列学习一】TP6 基于 redis 实现消息队列和延迟队列 - 奇点原生 - 博客园 (cnblogs.com)

  • 相关阅读:
    字符编码
    数据类型
    流程控制之判断,while循环,for循环
    数据类型,与用户交互,格式化输出,基本运算符
    操作系统,编程语言分类,执行python两种方式,变量,内存管理,定义变量的三个特征
    计算机硬件基础-笔记
    20200714_31adb命令和monkey压力稳定性测试
    20200707_28POM
    20200705_27DDT与Yaml数据驱动
    20200702_26UnitTest套件与运行器
  • 原文地址:https://www.cnblogs.com/yangfei123/p/15071908.html
Copyright © 2011-2022 走看看