TP5.1的队列queue试用方法

阅读次数: 924

  • A+
所属分类:PHP PHP 建站

1.全局任务触发
场景
用户注册 发送消息至 业务员 管理员
业务员处理用户信息后 发送消息至 客户 管理员
用户报价单生成 发送消息至 业务员 管理员
业务员处理用户信息后 发送消息至 客户 管理员

独立的消息数据库
消息类型 消息内容 消息id 关联路由

正常的流程 用户注册成功后 直接调用发送消息的方法 插入一条或多条数据 即发送给相关人员 同样的数据 但是这样效率会低

分布式流程 用户注册成功后 查询出 相关人员ID 及信息 (手机号 微信openid 邮箱) 获取出需求发送的站内信或短信模板,将发送消息的任务加入 队列

多个队列并行跑(用户注册队列,报价队列,下单队列)

任务板块

/application/api/controller/job 类

<?php
/**
 * Created by 大师兄
 * 派系: 神秘剑派
 * 技能: zxc秒杀
 * Date: 2021/1/9
 * Time: 10:42
 * QQ:  997823131
 */
namespace app\api\controller;

use think\Queue;
class Job
{

    /**
     * auther:Jack
     * 用户的任务
     * 发送对应的消息到不同的人员
     * 运行时保障能分别发送消息
     */

    public function task_user($data,$fun_name){
        $job_class_name = 'app\job\controller\User';
        $job_queue_name = "task_user";
        $job_data = $data;
        $isPushed = Queue::push($job_class_name,$job_data,$job_queue_name);
        if($isPushed !== false){
            p(date('Y-m-d H:i:s') . " a new order_add Job is Pushed to the MQ"."<br>");
        }else{
            p("Oops,something went wrong");
        }
    }

    public function user_reg(){
        $member_id = mt_rand(100,999);
        $msg = "我是一条新的消息".date("y-m-d H:i:s");
        $data['member_id'] = $member_id;
        $data['msg_body'] = $msg;
        $data['ts'] = time();
        $data['biz_id'] = uniqid();
        $data['act'] = __FUNCTION__;
        $this->task_user($data,__FUNCTION__);
    }

    public function order_add(){
        $customer_id = mt_rand(100,999);
        $msg = "我是一条新订单".date("y-m-d H:i:s");
        $data['customer_id'] = $customer_id;
        $data['msg_body'] = $msg;
        $data['ts'] = time();
        $data['biz_id'] = uniqid();
        $data['act'] = __FUNCTION__;
        $this->task_user($data,__FUNCTION__);
    }

}

执行板块

/application/job/controller/User 执行板块中的 用户任务板块

<?php
/**
* Created by 大师兄
* 派系: 神秘剑派
* 技能: zxc秒杀
* Date: 2021/1/12
* Time: 10:47
* QQ: 997823131
*/
namespace app\job\controller;

use think\facade\Log;
use think\queue\Job;
use think\Request;

class User{

public function index(){
p('index');
}

public function fire(Job $job,$data){
$fun_name = $data['act'];
p("方法名称:".$fun_name);
if(!empty($fun_name)){
switch ($fun_name){
case "user_reg":
$isJobDone = $this->user_reg($data);
if($isJobDone){
$job->delete();
}
break;
case "order_add":
$isJobDone = $this->order_add($data);
if($isJobDone){
$job->delete();
}
break;
}

}
}

public function user_reg($data){
$member_id = $data['member_id'];
$msg_body = $data['msg_body'];
$str = "会员ID".$member_id."消息内容".$msg_body;
$result = file_put_contents("member.txt",$str.PHP_EOL,FILE_APPEND);
return true;
}

public function order_add($data){
$customer_id = $data['customer_id'];
$msg_body = $data['msg_body'];
$str = "客户ID".$customer_id."消息内容".$msg_body;
$result = file_put_contents("customer.txt",$str.PHP_EOL,FILE_APPEND);
return true;
}

}

快捷操作

php think queue:work --queue task_user --daemon

开始监听 task_user 队列

加入任务 直接请求 /api/job/user_reg 或 order_add 即可

最后再做一个监听程序(防止程序崩溃时有提示给运维)

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: