tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

添加队列

/**
     * 发送一个推送
     * @param mixed client_id 设备号(字符串/数组) 1
     * @param int group 分组(如:1=用户端2=骑手端) 1
     * @param msg_type   透传消息类型
     * @param order_id   订单ID
     * @return mixed
     * @author xuefeiniao
     * @date 2022/2/25 1:44 下午
     */
    public static function send_notice($data)
    {
        $dataArr = [
            'type'          => 2,
            'client_id'    => $data['client_id'],
            'template_type' => 3,
            'group' => $data['group'],
            'title'         => '',
            'content'       => '',
            'payload'       => json_encode(['type' => 2,'msg_type'=>$data['msg_type'], 'order_id' => $data['order_id']])
        ];

        // 1.当前任务将由哪个类来负责处理。
        //   当轮到该任务时,系统将生成一个该类的实例,并调用其 fire 方法
//        $jobHandlerClassName  = 'app\common\OrderNotice';
        $jobHandlerClassName  = 'app\common\job\OrderNotice';
        // 2.当前任务归属的队列名称,如果为新队列,会自动创建
        $jobQueueName        = "SendRiderNoticeJobQueue";
        // 3.当前任务所需的业务数据 . 不能为 resource 类型,其他类型最终将转化为json形式的字符串
        // 4.将该任务推送到消息队列,等待对应的消费者去执行
        $res = Queue::push( $jobHandlerClassName , $dataArr , $jobQueueName );
    }

消费队列

php
/**
 * Created by PhpStorm.

 * User: Administrator
 * Date: 2020/3/18 0018
 * Time: 14:36
 */

namespace app\common\job;
use think\Db;
use think\facade\Log;
use think\queue\Job;
use app\operation\model\SystemMessage;

class OrderNotice
{
    /**
     * fire方法是消息队列默认调用的方法,tp5.1中,调用的类是 $jobHandlerClassName = 'app\lives\job\SendGift';
     * @param Job            $job      当前的任务对象
     * @param array|mixed    $data     发布任务时自定义的数据
     */
    public function fire(Job $job,$data){
        //根据消息中的数据进行实际的业务处理...

        $isJobDone = $this->doJob($data);
        // file_put_contents("1.txt",json_encode($isJobDone).PHP_EOL, FILE_APPEND);
        if ($isJobDone) {
            //如果任务执行成功, 记得删除任务
            $job->delete();
        }else{
            if ($job->attempts() > 2) {
                //通过这个方法可以检查这个任务已经重试了几次了
                /// Log::info('自动取消订单执行失败,已经重试好多次');
                $job->delete();
                // 也可以重新发布这个任务
                //print("Hello Job will be availabe again after 2s."."\n");
                //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
            }
            //  Log::info('推送消息失败');
        }
    }
    /**
     * 发送消息推送
     * 根据消息中的数据进行实际的业务处理
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function doJob($data) {
       // 个推 (zb 框架)
        $res = addons_action('Getui/Getui/pushMessageToList', [$data]);
        // jpush (fastadmin)
//        $objectPush    = new \addons\gpush\controller\Index;
//        switch ($type) {
//            case 1:
//                $res = $objectPush->pushMessageToSingle($data, $clientId, $template_type, $group); //
//                break;
//            case 2:
//                $res = $objectPush->pushMessageByTag($data, $clientId, $template_type);
//                break;
//            case 3:
//                $res = $objectPush->pushMessageToApp($data, $clientId, $template_type);
//                break;
//            case 4:
//                $res = $objectPush->pushMessageToList($data, $clientId, $template_type);
//                break;
//        }

        if($res){
            return true;
        }else{
            return false;
        }
    }

}

修改redis配置(如项目中未用到,用到可忽略,如不配置无法加入队列)

如果队列,不用redis存储也可以用数据库存储,那么就必须建表(存储队列的表) tp规定 表名为:前缀_jobs

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 50553
 Source Host           : localhost:3306
 Source Schema         : ordershop

 Target Server Type    : MySQL
 Target Server Version : 50553
 File Encoding         : 65001

 注意:sql中的表前缀为:tp
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tp_jobs
-- ----------------------------
DROP TABLE IF EXISTS tp_jobs;
CREATE TABLE tp_jobs  (
  id int(11) NOT NULL AUTO_INCREMENT,
  queue varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  payload longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  attempts tinyint(3) UNSIGNED NOT NULL,
  reserve_time int(10) UNSIGNED DEFAULT NULL,
  available_time int(10) UNSIGNED NOT NULL,
  create_time int(10) UNSIGNED NOT NULL,
  PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;

修改queue 配置文件

return [
//    'connector' => 'Sync' // 系统文件存储,会立即执行推送而非队列
     'connector'  => 'Redis',    // Redis 驱动
        'expire'     => 900,        // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
        'default'    => 'chat',    // 默认的队列名称
        'host'       => '127.0.0.1',    // redis 主机ip
        'port'       => 6379,        // redis 端口
        'password'   => 'redis密码',        // redis 密码
        'select'     => 10,        // 使用哪一个 db,默认为 db0
        'timeout'    => 0,        // redis连接的超时时间
        'persistent' => false,        // 是否是长连接
]

其他

1.下载supervisor

tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

配置
项目目录,而非public目录

tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

2.启动命令(–daemon 表示执行完不退出,多次执行,不加表示执行完任务退出)
tp5.1

php think queue:work --queue SendRiderNoticeJobQueue   [--daemon]

tp5.0

php /www/wwwroot/路径/think queue:work --queue order_queue_name --daemon

3.下载redis数据管理工具

tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

桌面版的redis管理工具(Another Redis DeskTop Manager)

tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

宝塔面板的错误:

有时会打开报错:AttributeError: ‘list’ object has no attribute ‘decode’
参考文章修改报错修复

转: https://blog.csdn.net/qq_36957701/article/details/123219085

Original: https://www.cnblogs.com/fps2tao/p/16397349.html
Author: 与f
Title: tp5,把耗时操作转为队列,queue + redis + supervisor消息推送(队列的执行异步不异步不知道,workman,swoole可以异步)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528822/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • sed与awk命令

    1.1 sed命令语法 在看单个命令以前,需要回顾一下关于所有sed命令的两点语法。在上一个章中,我们介绍了其大部分内容。行地址对于任何命令都是可选的。它可以使一个模式,被描述为由…

    Linux 2023年6月7日
    0113
  • 内网渗透测试:利用DCOM进行横向渗透——利用ExecuteShellCommand在做远程命令执行

    COM COM即组件对象模型(Component Object Model,COM) ,是基于 Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。COM是…

    Linux 2023年5月28日
    089
  • 爱前端公开课学习笔记——JS01 认识js 变量

    认识js 在谷歌浏览器的控制台中右键单击空白处,选择检查可以打开控制台 查看console.log输出的内容。 JS的注释 是”//”或者”/ …

    Linux 2023年6月14日
    0103
  • Docker 容器中安装 Docker

    本文讲的是在Docker中安装Ubuntu容器,然后在这个Ubuntu容器中再安装Docker。或许这样可以省下买服务器的钱,当然这只是为了学习测试使用,真正项目上还是需要买服务器…

    Linux 2023年6月14日
    0104
  • .htaccess文件解析漏洞

    前言 htaccess文件(或者”分布式配置文件”),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的…

    Linux 2023年6月13日
    080
  • 2020年12月-第02阶段-前端基础-CSS Day07

    CSS Day07 CSS高级技巧 *理解 能说出元素显示隐藏最常见的写法能说出精灵图产生的目的能说出去除图片底侧空白缝隙的方法 *应用 能写出最常见的鼠标样式能使用精灵图技术能用…

    Linux 2023年6月8日
    0131
  • Redis高可用架构Sentinel

    1 简介 哨兵是用来解决redis高可用性的,可以监控集群中主从的变化,然后进行故障转移。一套合理的监控机制是Sentinel节点判定节点不可达的重要保证,Redis Sentin…

    Linux 2023年6月13日
    0101
  • JAVA设计模式-原型模式

    JAVA设计模式-原型模式 介绍 原型模式是一种创建型模式,用于创建重复的对象,并且保证性能。原型模式创建的对象是由原型对象自身创建的,是原型对象的一个克隆,和原型对象具有相同的结…

    Linux 2023年6月6日
    0105
  • sftp配置

    有很多方法,可实现在网络上分享文件。其中之一为FTP协议。但FTP通过明文传输数据,不安全。幸运的是,SSH协议族中包含了用于传输文件的SFTP协议。 事实上,任何远程主机的用户,…

    Linux 2023年6月14日
    0114
  • docker redis启动将配置文件挂载在数据卷(volume)中

    关键词 [     "linux",     "docker",     "volume",     "red…

    Linux 2023年5月28日
    089
  • SSH 完全教程 2

    SSH 默认采用密码登录,这种方法有很多缺点,简单的密码不安全,复杂的密码不容易记忆,每次手动输入也很麻烦。密钥登录是b比密码登录更好的解决方案。 密钥是什么 密钥(key)是一个…

    Linux 2023年6月7日
    074
  • Redis持久化原理 — RDB与AOF详细解释

    一、持久化的作用 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化Redis所有数据保持在内存中,对数据的更新将异步地保存…

    Linux 2023年5月28日
    074
  • jquery ajax提交数据给后端

    大家好,今天铁柱兄给大家带一段jquery ajax提交数据给后端的教学。 初学javaweb的同学前端提交数据基本上都是用form表单提交,这玩意儿反正我是觉得不太好玩。而Jav…

    Linux 2023年6月13日
    089
  • Java轻松实现,每天给对象发情话!

    一、引言 最近看到一篇用js代码实现表白的文章,深有感触。然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞实现思路: 使用HttpClien…

    Linux 2023年6月14日
    087
  • PYTORCH: 60分钟 | TORCH.AUTOGRAD

    torch.autograd 是PyTorch的自动微分引擎,用以推动神经网络训练。在本节,你将会对autograd如何帮助神经网络训练的概念有所理解。 背景 神经网络(NNs)是…

    Linux 2023年6月16日
    0174
  • 数据链路层 交换机的工作原理

    以太网 以太网是一种将几台电脑连接起来,能够进行通讯的技术,也就是组建所谓的”局域网”。所以以太网可以说是一种局域网技术但局域网技术并非只有以太网一种,还有…

    Linux 2023年6月6日
    0120
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球