ThinkPHP5 自定义命令行处理监听Redis key失效触发回调事件,实现延迟任务 实现自动取消订单,自动完成订单

it2023-05-08  71

一、安装Redis

二、修改Redis配置如下所示,并重启:

这里需要配置 notify-keyspace-events 的参数为 “Ex”。x 代表了过期事件。notify-keyspace-events “Ex” 保存配置后,重启Redis服务,使配置生效。

三、安装php的Redis扩展

四、在  \think\cache\driver\Redis()  添加几个方法,或者重新定义一个Redis方法:

/*自定义Redis*/ public function setex($key, $time, $val) { return $this->handler->setex($key, $time, $val); } public function expire($key = null, $time = 0) { return $this->handler->expire($key, $time); } public function psubscribe($patterns = array(), $callback) { $this->handler->psubscribe($patterns, $callback); } public function setOption() { $this->handler->setOption(\Redis::OPT_READ_TIMEOUT, -1); } /*自定义Redis*/

五、application\command.php  新增一个  

<?php /** * Created by PhpStorm. * User: 吴伟祥 * Email: cwwx0128@qq.com * QQ: 1113249273 * Date: 2020/10/20 * Time: 13:52 */ return [ 'app\api\controller\Gopush', //脚本推送进程常驻 ];

六、新建控制器 app\api\controller\Gopush

<?php namespace app\api\controller; use think\Controller; use think\Request; use think\console\Command; use think\console\Input; use think\console\Output; class Gopush extends Command { protected function configure() { $this->setName('gopush')->setDescription('Here is the gopush'); } protected function execute(Input $input, Output $output) { $redis = new \think\cache\driver\Redis(); $redis->setOption(); // $redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback'); $redis->psubscribe(array('__keyevent@0__:expired'), function ($redis, $pattern, $channel, $msg){ echo PHP_EOL; echo "Pattern: $pattern\n"; echo "Channel: $channel\n"; echo "Payload: $msg\n\n"; //................ /*TODO处理业务逻辑*/ }); $output->writeln("TestCommand:998998998"); } // public static function keyCallback($redis, $pattern, $chan, $msg) // { // echo "Pattern: $pattern\n"; // echo "Channel: $chan\n"; // echo "Payload: $msg\n\n"; // //keyCallback为订阅事件后的回调函数,这里写业务处理逻辑, // //比如前面提到的商品不支付自动撤单,这里就可以根据订单id,来实现自动撤单 // } }

七、执行命令  php think gopush 让进程在终端运行(后面放到常驻进程里面去 supervisor),如下图所示 (重点:每次修改了东西,守护进程要进行重启才有效)(启动如果一直失败,就将启动用户改为root)

八、触发方法:$key 可以用来做需要的内容数据拼接,时间可以根据订单倒计时算出来秒数,第三个参数只是备注

/*这个格式去推送消息-用户设置的时候处理*/ public function r3(){ $re=new Redis(); $key='推送别名-内容ID-用户ID'; $re->setex($key,3,'redis延迟任务'); //3秒后回调 }

九、thinkphp自定义命令 https://www.kancloud.cn/manual/thinkphp5/235129  可以看着理解,很简单的

十、参考博客,都是原生的,最后还得封装,我都给你们封装好了

参考地址一

参考地址二

参考地址三

参考地址四

参考地址五

参考地址六

参考地址七

十一、划重点

/*$redis->psubscribe(array('__keyevent@'.$redis_db.'__:expired'), function ($redis, $pattern, $channel, $msg){ echo PHP_EOL; echo "Pattern: $pattern\n"; echo "Channel: $channel\n"; echo "Payload: $msg\n\n"; //................ });*/

点击链接加入群聊【ThinkPHP56小功能】:https://jq.qq.com/?_wv=1027&k=Z0c641WP 

最新回复(0)