Thinkphp加Redis实现订单超时自动取消功能
一、环境安装:
nginx1.8 + php73 + mysql57 +redis6环境安装略过
-
安装thinkphp composer create-project topthink/think tp 缓存管理composer require topthink/think-cacheTP6默认自带里面包含Redis类 安装phpredis扩展:composer require predis/preids
二、环境配置
- PHP开启Redis扩展 下载地址: 或者 windows开启,打开php.ini添加 extension=php_redis.dll Linux开启 vim /usr/local/php/etc/php.ini extension = redis.so
- Redis设置 linux配置文件名:redis.conf windows位置文件名:redis.windows.conf 打开Redis配置文件,找到notify-keyspace-events ""修改为notify-keyspace-events Ex;
- 重启PHP和Redis服务
三、代码部分
配置文件
config/cache.php 如果没有新建一个
return [ // 默认缓存驱动 default => env(cache.driver, file), // 缓存连接方式配置 stores => [ file => [ // 驱动方式 type => File, // 缓存保存目录 path => , // 缓存前缀 prefix => , // 缓存有效期 0表示永久缓存 expire => 0, // 缓存标签前缀 tag_prefix => tag:, // 序列化机制 例如 [serialize, unserialize] serialize => [], ], // 添加Redis配置 redis => [ type => redis, host => 127.0.0.1, port => 6379, password => , select => 0, // 全局缓存有效期(0为永久有效) expire => 0, // 缓存前缀 prefix => , timeout => 3600 * 24, ], ], ];
config/console.php 如果没新建一个此文件及代码是为了自定义Command下面有流程,和这个文件先放在这里
return [ // 指令定义 commands => [ GoRedis => appcontrollerGoRedis ], ];
自定义一个Command
appcontroller下面新建一个GoRedis.php代码如下
<?php /** *Created by PhoStorm *Author:Shen Guoan 13937100809 *Date:2022/2/22 *Time:14:47 */ namespace appcontroller; use thinkconsoleCommand; use thinkconsoleInput; use thinkconsoleOutput; use thinkfacadeCache; class GoRedis extends Command { protected function configure() { $this->setName(GoRedis)->setDescription(Here is the GoRedis); } protected function execute(Input $input, Output $output) { $output->writeln(开始监听...); Cache::store(redis)->handler()->config(notify-keyspace-events,Ex); Cache::store(redis)->handler()->setOption(Redis::OPT_READ_TIMEOUT, -1); Cache::store(redis)->handler()->psubscribe(array(__keyevent@0__:expired), appcontrollerGoRedis::key_callback); } public static function key_callback($redis, $pattern, $channel, $payload){ echo "Pattern: $pattern "; echo "Channel: $channel "; echo "Payload: $payload "; /*TODO处理业务逻辑*/ } }
使用方法
//假如您的订单为$order //开启 1个小时后,任务自动取消 $data=[操作类型根据您自己需要,$orde[order_id],$order[user_id]]; //序列化 或 转换成字符串 //$pusher_data=serialize($pusher_data); pusher_data=implode($data,,);//转换成字符串 Cache::store(redis)->set($data,$data,3600);
开始-》输入-》cmd 输入
php think GoRedis
如图 今天太晚了先写到这里,后面还有点进程守护(Supervisor)