使用 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 “捕捉” “用户登录过期” 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何捕捉键盘和鼠标事件?

在屏幕上捕捉加速事件

Joomla - 如何捕捉系统事件

PhoneGap 捕捉 iPhone 的“Go”按下事件

准确捕捉移动端的“scrollend”事件

js事件冒泡与捕捉解析