使用 redis “捕捉” “用戶登錄過期” 事件
阿新 • • 發佈:2017-05-21
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 “捕捉” “用戶登錄過期” 事件