使用 redis “捕捉” “用户登录过期” 事件
Posted Tiac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 redis “捕捉” “用户登录过期” 事件相关的知识,希望对你有一定的参考价值。
实现原理及步骤:
1)登录时,计算登录过期时间,以天为单位作key(例如:sign_timeout_20170521),value方面自己发挥,需要什么数据就拼什么数据进去,只是要注意,一定要拼一个个过期时间进去,然后为了方便追加数据,value后台也可以直接拼一个逗号(例如:1495353081_1,),写一条记录到 redis。也就是同一天过期的用户信息记录到一条redis记录里(第二条开始用append追加,逗号分隔)。
$expires = time()+7*24*3600; setcookie(‘_uid‘, 1, $expires); setcookie(‘_uid_expires‘, $expires, $expires); $Ymd = date(‘Ymd‘, $expires); Helper_Redis::append(‘sign_timeout_‘.$Ymd, $expires.‘_1,‘);
2)然后写一条计划任务,
每分钟查询一次redis记录(用当前时间,用上面的方法,拼接出 key),如果没记录就退出,
如果有记录,转回数组,
然后循环判断是否过期,作相应处理就行了
require(‘./Helper_Redis.class.php‘); $Ymd = date(‘Ymd‘, time()); $redis_key = ‘sign_timeout_‘.$Ymd; $list_str = Helper_Redis::get($redis_key); if(empty($list_str)) die(‘success‘); $list_arr = explode(‘,‘, $list_str); array_pop($list_arr); $handle = false; $now = time(); $iData = array(); foreach ($list_arr as $key=>$item) { $detail = explode(‘_‘, $item); // 过期了 if($detail[0]<$now) { unset($list_arr[$key]); // 需要处理的过期数据 $iData[] = $detail; $handle = true; } } // 如果有处理到删除(至少一个) if($handle) { if(!empty($list_arr)) { $new_value = implode(‘,‘, $list_arr) . ‘,‘; Helper_Redis::set($redis_key, $new_value); } else { Helper_Redis::delete($redis_key); } // 处理写登出日志 // Helper_Userlogs::saveSignOut_all($iData); }
完
以上是关于使用 redis “捕捉” “用户登录过期” 事件的主要内容,如果未能解决你的问题,请参考以下文章