先上设计图
说明:任务模块分一次性任务和每日任务,可能还包括男女用户任务区分
处理步骤:
一、同步任务数据库
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下载下来是有问题的,需要修改,写入内存和常驻内存要熟悉命令。
修改了核心文件需要重启执行命令。