数据库
首页 > 数据库> > tp5.1+redis 订单超时取消 windos

tp5.1+redis 订单超时取消 windos

作者:互联网

我使用的是tp5.1

安装redis 扩展不细节描述

phpstudy 安装的redis 需要修改默认配置文件

步骤1:

redis 的配置修改:

notify-keyspace-events "Ex"

重启redis

步骤2:

创建公用redis类

<?php


namespace app\command\Controller;

use think\cache\driver\Redis;

class MyRedis
{
    private $redis;

    public function __construct($host = '127.0.0.1', $port = 6379)
    {
        $this->redis = new Redis();
        $this->redis->config('notify-keyspace-events','Ex');//开启redis key 过期通知(修改配置文件失效可加上)
        $this->redis->connect($host, $port);
        $this->redis->auth('123456');
    }
    public function setex($key, $time, $val)
    {
        return $this->redis->setex($key, $time, $val);
    }

    public function set($key, $val)
    {
        return $this->redis->set($key, $val);
    }

    public function get($key)
    {
        return $this->redis->get($key);
    }

    public function expire($key = null, $time = 0)
    {
        return $this->redis->expire($key, $time);
    }

    public function psubscribe($patterns = array(), $callback)
    {
        $this->redis->psubscribe($patterns, $callback);
    }

    public function subscribe($patterns = array(), $callback)
    {
        $this->redis->subscribe($patterns, $callback);
    }

    public function setOption()
    {
        $this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
    }

}

步骤3:

          //下单业务插入redis
    public function  redis(){
        $redis = new \app\command\Controller\MyRedis();
        $order_num = 2;
        $redis->setex("orderNum_".$order_num,20,$order_num);
        echo "待确认订单生成成功,20 秒后自动取消订单号:".$order_num;
    }
    //取消订单、支付成功删除redis数据
    public function  noRedis(){
        $redis = new \app\command\Controller\MyRedis();
        $order_num = 2;
        //删除订单过期标记
        $redis->del("orderNum_".$order_num);
        //修改数据库订单状态
         Db::name('')->update();
        echo "修改成功".$order_num;
    }

步骤4:

app->command.php

<?php

return [
    'app\command\Test',
];

步骤5:

编辑监听方法  cmd运行     项目根目录    php think test    

<?php

namespace app\command;


use think\console\Command;
use think\console\Input;
use think\console\Output;
use app\common\controller\MyRedis;
use think\Db;


class Test extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('test')
            ->setDescription('测试订单过期处理');
        // 设置参数
        
    }

    protected function execute(Input $input, Output $output)
    {
        ini_set('default_socket_timeout', -1);
        // 指令输出
      
        $redis = new \app\command\Controller\MyRedis(); //其他地方找的redis操作
        $redis->setOption();
        $redis->psubscribe(array('__keyevent@0__:expired'), function ($redis, $pattern, $chan, $msg) {
            echo PHP_EOL;
            echo "Pattern: $pattern\n";
            echo "Channel: $chan\n";
            echo "Payload: $msg\n\n";
           
            echo 'order:订单处理成功\n';

            /*业务逻辑处理*/
              $quey = Db::name();
        });

    }


}

前台下单后过期显示

处理成功 

标签:function,tp5.1,windos,redis,order,num,key,public
来源: https://blog.csdn.net/lingyu_csdn/article/details/120883015