1.php session 有效期間
php的session有效期間預設是1440秒(24分鐘),如果用戶端超過24分鐘沒有重新整理,當前session會被回收,失效。
當使用者關閉瀏覽器,會話結束,session也會失效。
可以修改php.ini的session.gc_maxlifetime來設定session的生命週期,但並不能保證在超過這一時間後session資訊立即會刪除。因為GC是按機率啟動的,可能在某一個長時間內都沒有被啟動。那麼大量的session在超過session.gc_maxlifetime後仍然有效。
2.session.gc_maxlifetime,session.gc_probability,session.gc_pisor說明
session.gc_maxlifetime = 30 表示當session檔案在30秒後沒有被訪問,則視為到期session,等待GC回收。
GC進程調用的機率是通過session.gc_probability/session.gc_pisor計算得來的,而session.gc_pisor預設是1000,
如果session.gc_probability = 1000,那麼GC進程在每次執行session_start()時都會調用,執行回收。
把session.gc_probability/session.gc_pisor的機率提高,會有協助,但會對效能造成嚴重影響。
3.嚴格控制session到期方法
1.使用memcache/redis來儲存session,設定到期時間,因為memcache/redis的回收機制不是按機率的,可以確保session到期後失效。
2.只使用php實現,建立一個session類,在session寫入時,把到期時間也寫入。讀取時,根據到期時間判斷是否已到期。
<?php/** * Session控制類 */class Session{ /** * 設定session * @param String $name session name * @param Mixed $data session data * @param Int $expire 逾時時間(秒) */ public static function set($name, $data, $expire=600){ $session_data = array(); $session_data['data'] = $data; $session_data['expire'] = time()+$expire; $_SESSION[$name] = $session_data; } /** * 讀取session * @param String $name session name * @return Mixed */ public static function get($name){ if(isset($_SESSION[$name])){ if($_SESSION[$name]['expire']>time()){ return $_SESSION[$name]['data']; }else{ self::clear($name); } } return false; } /** * 清除session * @param String $name session name */ private static function clear($name){ unset($_SESSION[$name]); }}?>
demo:
<?phpsession_start();$data = '123456';session::set('test', $data, 10);echo session::get('test'); // 未到期,輸出sleep(10);echo session::get('test'); // 已到期?>
本文講解了 如何利用php設定一個嚴格控制到期時間的session ,耕讀相關內容請關注php中文網。
相關推薦:
關於mysql 時間戳記格式化函數from_unixtime的使用說明
關於mysql函數concat與group_concat使用說明事項
關於mysql innodb啟動失敗無法重啟的處理方法講解