代碼很簡單 實現的方式很多,用cookies 用static 變量 file文件緩存 等等
比如
//簡單行為管理,如果請求此方法次數多於5次,就顯示驗證碼 吧當前方法的name傳進來,有效時間是5分鍾,$return=1是增加,$return=2就是只是返回$_COOKIE[$name]的值 function behavior_function($function = __FUNCTION__, $class = __CLASS__, $return=1) { $name = 'behavior_' . $class . '_' . $function; if($return ==1) { setcookie($name, $_COOKIE[$name] + 1, time() + 3000, "/"); }elseif($return ==2){ return $_COOKIE[$name] > 5 ? true : false; } }
調用
public function index() { if (IS_POST) { //嘗試登陸次數增加 behavior_function(__FUNCTION__, __CLASS__,1); } else { $res = behavior_function(__FUNCTION__, __CLASS__,2); $codes = $res === true ? 1 : NULL; $this->assign("codes", $codes); $this->display(); } }
//為了微信頁面好看,將中文字符小於4的補充空格
function cn_string_to_4($str) { if(mb_strlen($str,'utf8') <4){ return $str = $str.str_repeat(' ', (4-mb_strlen($str,'utf8'))); } return $str; }
通過cookies,做一個簡單的。使用session做過期驗證碼的功能
這有2個版本
/* * 設置一個定時有效的session值, tp的session函數貌似沒有這個功能 * * $time 格式是實踐戳 * * $type 1 儲存 和 更新session存活時間 * 2 查看獲取 * 3 銷毀 */ function session_limit_time_save($type=1,$name='', $value = '', $expire = '') { $session_time_name = $name . "_time"; $session_expire = $name . 'expire'; switch ($type) { case 1: $_SESSION["$name"] = $value; $_SESSION["$session_time_name"] = time(); $_SESSION["$session_expire"] = $expire; break; case 2: if (time() - $_SESSION["$session_time_name"] > $_SESSION["$session_expire"]) { //訪問過期session,就銷毀 unset($_SESSION["$name"]); unset($_SESSION["$session_time_name"]); unset($_SESSION["$session_expire"]); return NULL; } else { return $_SESSION["$name"]; } break; case 3: unset($_SESSION["$name"]); unset($_SESSION["$session_time_name"]); unset($_SESSION["$session_expire"]); break; default: echo '數據處理模式錯誤!'; break; } }
這個不太好,因為在$_SESSION上可以看到其他的值,其實一般都是借助cookies來實現過期判斷
比如
$time = 30 * 30;//半小時過期 setcookie(session_name(), session_id(), time() + $time);
我還嘗試過使用,直接訪問session的temp文件,去實現過期,但是發現,session存的數據格式是
ss|s:4:"1111";ees|s:4:"1111";e1es|s:2:"55";ee2s|s:2:"22";ee3s|s:6:"155111";
沒有存放過期時間,是通過設置的全局過期時間,做創建時間過期,刪除和更新的
偽代碼:
$session_path = "sess_".session_id(); $sessionpath = session_save_path(); $file_name_path = $sessionpath.'/'.$session_path; //$a=filemtime($file_name_path); $a=filectime($file_name_path); //$a=fileatime($file_name_path); $r = date("Y-m-d H:i:s",$a); var_dump($r); $rr = get_cfg_var('session.gc_maxlifetime'); var_dump($rr);
發現效果不是很好,最后決定借用cookies來做定時過期
自動登錄
原理很簡單就是在你需要控制的需要登錄控制的父控制器做一個__construct方法,在登錄的去set一個cookies ,可解密的加密算法,
public function __construct() {
//解密
}
當然在登錄的時候記得讓cookies 過期,不然會出現,退出依然可以登錄問題
訪問需要權限的時候,去獲取cookies,解密獲取賬號和密碼,在去模擬登錄,創建session,和登錄差不多,cookies沒有就什么都不做就,讓權限系統去出路頁面訪問權限
