1. 程式人生 > >使用 redis “捕捉” “用戶登錄過期” 事件

使用 redis “捕捉” “用戶登錄過期” 事件

unset 例如 empty data help pen die 退出 implode

實現原理及步驟:

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 “捕捉” “用戶登錄過期” 事件