当前位置: 首页 > news >正文

APP任务模块功能借助php-resque实现业务解耦

先上设计图

 

说明:任务模块分一次性任务和每日任务,可能还包括男女用户任务区分

处理步骤:

一、同步任务数据库

    1.1、任务列表数据库

   1.2、完成任务数据库

二、搭建即时消息队列

一、composer require resque/php-resque

二、因为服务器redis设置了密码,所以要修改包文件

vendor/resque/php-resque/lib/Resque.php

手动修改redis连接方法

三、在项目增加  Worker.php   

3.1 增加内容

<?php/***在命令行执行  QUEUE=doTask  php app/jobs/Worker.php       QUEUE=doTask QUEUE=前面是参数* 后台执行  QUEUE=doTask nohup  php app/jobs/Worker.php &* QUEUE doTask:做任务*/
@define("IN_APP", true);
@define("APP_DIR", "/www/wwwroot/seeklove_main");
require_once(APP_DIR."/configs/config.inc.php");
require_once ROOT_PATH.'/vendor/autoload.php';
require_once(ROOT_PATH."/configs/init.inc.php");
require_once(ROOT_PATH."/common/functions.php");
require_once(ROOT_PATH."app/jobs/jobs.php");class Worker{/*** @router cli work*/public function run(){require_once APP_DIR."/vendor/resque/php-resque/bin/resque";}
}$worker = new Worker();
$worker->run();
说明:
require_once(ROOT_PATH."app/jobs/jobs.php");处理队列中的业务文件

3.2 在linux 命令窗口 执行 以下面命令,将消息队列常驻内存,这样有消息进来就可以立马消费掉

QUEUE=doTask nohup  php app/jobs/Worker.php &

3.3 jobs.php文件内容,是一个类

public function perform(){fwrite(STDOUT, 'Start job! -> ');
//        echo json_encode($this->args);$args = $this->args;if(!empty($args)){MyJobs::{$args['type']}($args['data']);}fwrite(STDOUT, 'Job ended!' . PHP_EOL);}

3.4 增加通用文件,doTask方法为我处理任务模块用的 

class MyJobs
{public function __construct(){
//        $redis = new RedisConn();
//        $this->redis = $redis->getConn();
//        Resque::setBackend($this->redis->getHost().":".$this->redis->getPort(),$this->redis->getDbNum(),$this->redis->getAuth(),$this->redis);}//做任务public static function doTask($data){$TaskM = new TaskModel();$TaskM->doTask($data['uid'],$data['sign']);}
}
说明:
askModel()是具体的业务逻辑处理

任务模块的业务逻辑包括:

1、判断任务完成状态

2、更新用户奖励

3、写入记录

4、更新任务完成状态

5、写完成的任务缓存

6、发送消息通知给用户

注意点:Resque.php下载下来是有问题的,需要修改,写入内存和常驻内存要熟悉命令。

修改了核心文件需要重启执行命令。

http://www.lryc.cn/news/15477.html

相关文章:

  • 怎么做,才能在职场中晋升?
  • Vulnhub靶场----2、DC-2
  • Java 基础(3)—synchornized 关键字简单理解
  • 【Linux】调试工具gdb的使用
  • 大数据知识图谱项目——基于知识图谱的医疗知识问答系统(详细讲解及源码)
  • 威马汽车:跃马扬鞭未竟,鞍马劳顿难行?
  • 【网络】网络基础
  • Linux系统之Uboot、Kernel、Busybox思考之三
  • FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(一)
  • 性能测试学习和性能瓶颈分析路线
  • 达梦数据库(DM8)集成使用 Geoserver(2.22.2) 以及其他对应版本详解
  • 全开源无加密的RuleApp文章社区APP客户端源码
  • 基于springboot校园二手市场平台
  • 维度建模基本流程总结
  • RocketMQ事务消息
  • 大数据处理 - 双层桶划分
  • NFC标签读写器隐私协议
  • DocEE:一种用于文档级事件抽取的大规模细粒度基准 论文解读
  • ImageCombiner设计源码详解
  • python基础 | python基础语法
  • YOLOv6-3.0-目标检测论文解读
  • JAVA集合之Map >>HashMap/Hashtable/TreeMap/LinkedHashMap结构
  • JavaScript从零开始 学习记录(一)
  • C++项目——高并发内存池(3)--central cache整体设计
  • Spring Boot 整合 MyBatis 配置等案例教程
  • 比特数据结构与算法(第三章_下)队列的概念和实现(力扣:225+232+622)
  • c++提高篇——STL容器实现打分系统
  • 【图片上传记录三】element-ui组件详解与封装(自定义上传、限制文件大小、格式以及图片尺寸)
  • 一个golang版本管理工具
  • SpringBoot整合Spring Security过滤器链加载执行流程源码分析