TP5的消息队列

news2025/1/10 6:19:58

1.首先查看项目中是否已经有think-queue目录:/vendor/topthink/

微信截图_20200909142126.png


如果没有,则用composer安装(安装composer参考:http://www.runoob.com/w3cnote/composer-install-and-usage.html
),安装think-queue先进入到项目根目录,运行

composer require topthink/think-queue=1.1.6

安装完成后,有think-queue文件夹,再运行

php think queue:work -h

查看是否安装成功,出现如下,则安装成功

微信截图_20200909142609.png

2.配置队列,queue内置了四种驱动,推荐使用redis驱动。配置文件在application/extra/queue.php,如下

<?php
use think\Env;
return [
    'connector'  => 'Redis',        // Redis 驱动
    'expire'     => Env::get('queue.expire',60),        // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
    'default'    => 'default',      // 默认的队列名称
    'host'       => Env::get('queue.host','127.0.0.1'), // redis 主机ip
    'port'       => Env::get('queue.port',6379),        // redis 端口
    'password'   => Env::get('queue.password',''),      // redis 密码
    'select'     => Env::get('queue.select',0),     // 使用哪一个 db,默认为 db0
    'timeout'    => 0,      // redis连接的超时时间
    'persistent' => false,      // 是否是长连接
];

3.消息的创建和推送,首先要添加队列

<?php
namespace app\common\controller;
use think\Queue;
class OrderQueue
{
    static $className = 'app\common\job';
    public static function createOrderQueue($jobData)
    {
        // 1.当前任务将由哪个类来负责处理。
        //   当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
        $jobHandlerClassName  = self::$className.'\Order';
        // 2.当前任务归属的队列名称,如果为新队列,会自动创建
        $jobQueueName     = "createOrderJob";
        // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串
        //   ( jobData 为对象时,需要在此处手动序列化,否则只存储其public属性的键值对 )
        // 4.将该任务推送到消息队列,等待对应的消费者去执行
        $isPushed = Queue::push( $jobHandlerClassName , $jobData , $jobQueueName );
        // database 驱动时,返回值为 1|false  ;   redis 驱动时,返回值为 随机字符串|false
        if( $isPushed !== false ){
            return true;
        }else{
            return false;
        }
    }
}

4.消息队列的执行

<?php
namespace app\common\job;

use app\common\model\ErrorLog;
use think\queue\Job;

class Order
{
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job            $job      当前的任务对象
     * @param array|mixed    $data     发布任务时自定义的数据
     */
    public function fire(Job $job,$data)
    {
        //业务处理代码,具体不贴出来了
        $isJobDone = $this->create($data);

        if ($isJobDone) {
            // 如果任务执行成功, 记得删除任务
            $job->delete();
        }else{
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了

                $job->delete();

                // 也可以重新发布这个任务
                //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
            }
        }
    }

    private function create($data)
    {
        ErrorLog::insertLog('执行队列',__METHOD__,json_encode($data));

        return true;
    }
}

到此,所有代码准备完毕,经历了一个消息的 创建 -> 推送 -> 消费 -> 删除 的基本流程,
上面添加队列的代码只要放在任意一个控制器内就行,部分目录机构如下

微信截图_20200909143940.png

5.启用队列的监听模式,队列的监听模式有两种,配置参数如下

微信截图_20200909144211.png

只需要到项目根目录执行

php think queue:listen --queue createOrderJob

即可,具体根据项目实际情况加上不同的参数。而且我们具体是不能要让命令以守护进程执行。所以我们可以换成下面这条命令

nohup php think queue:listen --queue createOrderJob &

到此,整个消息队列就完成了

6.测试:

public function createOrder()
{
   $data = [
         'order_id' => 1,
    ];

   OrderQueue::createOrderQueue($data);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt文档阅读笔记-Qt, QML, Widgets…What Is The Difference?

Qt, QML, Widgets…What Is The Difference? 本节主要介绍了开发Qt程序最关机的几个组建。 Qt是使用C和一些C的框架设计编写出来的。 Qt Qt是一个开源的框架。 Qt作为一个框架&#xff0c;包含了许多组件&#xff0c;这些组建又在指定的模块中&#xff0c;Qt基础组件在&…

干货| 小游戏赛道变现指南

随着羊了个羊等小游戏的爆火&#xff0c;不少人发现了小游戏赛道的巨大潜力&#xff0c;也想要在此赛道有所尝试。但是很多游戏赛道的新人对于小游戏变现问题存有疑问&#xff0c;今天就来跟大家分享一下小程序游戏赛道的变现途径&#xff01; 近期FinClip 官方正在举行小游戏…

全志 芯片 Linux MIPI CSI摄像头接口开发指南 VIN DVP CSI MIPI V4l2

1 前言 1.1 文档简介 介绍 VIN&#xff08;video input&#xff09;驱动配置&#xff0c;API 接口和上层使用方法。 1.2 目标读者 camera 驱动开发、维护人员和应用开发人员。 1.3 适用范围 ​ 表 1-1: 适用产品列表 内核版本驱动文件Linux-4.9drivers/media/platform/s…

nacos源码分析-服务注册(服务端)

安装Nacos源码 上一篇文章我们了解了《Nacos服务注册》客户端源码&#xff0c;本篇文章我们来看一下服务注册Nacos服务端的源码执行情况。首先需要下载Nacos源码&#xff0c; https://github.com/alibaba/nacos/releases/tag/1.4.3 &#xff0c; 解压之后使用IDEA工具导入即可…

Web3中文|为什么去中心化存储对NFT元数据很重要

图中文字&#xff1a;哦&#xff0c;看&#xff0c;FTX用Web2 API托管了所有在其平台上铸造的NFT&#xff0c;现在所有这些NFT的元数据都被破坏了&#xff0c;并且链接到了一个重组的网站。 这本不应该发生。但对于任何不考虑元数据和如何存储元数据的NFT项目来说&#xff0c;…

docker(5):Dockerfile

目录Dockerfile介绍Dockerfile常用指令案例&#xff1a;构建tomcat镜像Dockerfile介绍 Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明&#xff0c;每条指令都会创建一个新的镜像层并对镜像进行提交。 Dockerfile 一般分…

【Django】第一课 基于Django图书借阅管理网站平台

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架&#xff0c;采用的是MTV架构模式进行分层架构。 项目搭建 打开pycharm开发软件&#xff0c;打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径&#xff0c;并使用创建django项目…

编辑器:保存格式化修复配置

规范化条目 制表符长度&#xff1a;2&#xff0c;缩进模式&#xff1a;2个空格&#xff0c;换行符&#xff1a;lf&#xff0c;末尾加分号&#xff0c;js单引号&#xff0c;冒号后一个空格&#xff0c;运算符前后一个空格&#xff0c;大括号&#xff08;有内容的&#xff09;首…

项目实战之旅游网(八)后台产品管理(下)

目录 一.上传产品图片 二.修改产品 三.上下架产品 一.上传产品图片 在新增产品时&#xff0c;我们还需要上传产品图片。我们采用异步上传的方法进行图片上传。 1.在conmmon_ resources.html 中引入jqueryform.js 2.修改product_ add.html 页面 点击保存 &#xff0c;自动…

【Spring【IOC】】——18、自定义组件中如何注入Spring底层的组件?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

LeetCode283.移动0

思路1 分析 在i位置遇到0&#xff0c;把后面的元素向前移动覆盖&#xff0c;然后把最后一个位置赋值为0即可 注意问题&#xff1a; 可能 i 一个位置 移动一次之后还是0&#xff0c;需要循环 有可能 i 位置的0 是因为 已经所有的0都到后面了 ​ 所以需要用count记录0的个数&am…

2022年区块链安全领域8成以上损失集中在DeFi和跨链桥

近期&#xff0c;欧科云链研究院上线《2022年全球区块链生态安全态势报告》&#xff0c;报告指出2022年区块链安全领域8成以上损失集中在DeFi和跨链桥&#xff0c;钓鱼攻击是最常见攻击手法。主要结论 2022年前11个月&#xff0c;OKLink共监测到区块链生态相关安全事件275起&a…

整理leetcode中”最长...“

1.最长公共子序列&#xff08;动态规划&#xff09;剑指offer95 输入&#xff1a;text1 “abcde”, text2 “ace” 输出&#xff1a;3 解释&#xff1a;最长公共子序列是 “ace” &#xff0c;它的长度为 3 。 Q1&#xff1a;为什么想到二维dp&#xff1f; A1&#xff1a;因…

JDBC第二章 (JDBC API详解)

目录 一、下载驱动包 二、加载与注册驱动 1、使用driverManager类 2、方式&#xff1a; 3、补充&#xff1a; 三、建立连接 1、URL 2.建立连接的方式 3.事务管理 4.获取Statement语句 1、普通版本 2、防止SQL注入版本 3、获取存储过程 四、Statement 1、概述 2…

数图互通高校房产管理——房屋模拟分配建设

数图互通房产管理系统在这方面做得比较全面&#xff1b; 1、 房屋模拟分配建设方案 实现对学校房屋分配进行情景模拟&#xff0c;在特定房屋类型、数量、使用面积等情况下&#xff0c;建立多个模拟分配方案&#xff0c;并对每个模拟分配方案生成明细清单。 1.1 房屋模拟分配清…

石墨烯太阳能供暖远程监控

石墨烯太阳能供暖系统是指采用全新一代石墨烯碳纤维电热膜为发热体&#xff0c;直接将电能转换为热能的供暖系统。再搭配太阳能光伏发电系统给石墨烯供暖系统供电&#xff0c;更加节能有效地解决用户用电问题。但目前这种供暖方式也存在诸多问题&#xff0c;如供暖温度得不到控…

深度学习交通标志识别项目

主要内容 在本文中&#xff0c;使用Python编程语言和库Keras和OpenCV建立CNN模型&#xff0c;成功地对交通标志分类器进行分类&#xff0c;准确率达96%。开发了一款交通标志识别应用程序&#xff0c;该应用程序具有图片识别和网络摄像头实时识别两种工作方式。 写作目的 近年…

jenkins 升级遇到问题总结

当我在使用jenkins的时候,避免不了下载很多插件,因为jenkins本身不提供很多功能,大部分的功能都是依赖插件来完成的,这也使jenkins更具有扩展性,但是,我在安装完成后打开插件列表居然是这样的。。。 或者插件列表打开的正常,但是安装某个插件时报这样的错误。。。 看标…

c++算法基础必刷题目——尺取法

文章目录尺取法1、字符串2、丢手绢尺取法 尺取法通常也叫滑动窗口法&#xff0c;顾名思义&#xff0c;像尺子一样取一段&#xff0c;借用挑战书上面的话说&#xff0c;尺取法通常是对数组保存一对下标&#xff0c;即所选取的区间的左右端点&#xff0c;然后根据实际情况不断地推…

Html网页和C++ App通信 - qwebchannel

Qt5 引入了 Qt WebChannel 的概念。这是为了在不能影响各端代码执行的前提下实现 Qt 端于 client 端的无缝 双向 通信。 QWebChannel 提供了在 C应用和 前端&#xff08;HTML/JS&#xff09;之间点对点的通信能力。通过向 前端的 QWebChannel 发布 QObject 的 派生对象&#xf…