1缠俺、session.gc_maxlifetime?控制 session 有效期?
PHP的session有效期默認(rèn)是1440秒(24分鐘),如果客戶端超過24分鐘沒有刷新凶掰,當(dāng)前session會被回收来破,失效。
可以修改php.ini的session.gc_maxlifetime來設(shè)置session的生命周期德频,但并不能保證在超過這一時間后session信息立即會刪除苍息。因為GC是按機率啟動的缩幸,可能在某一個長時間內(nèi)都沒有被啟動壹置。那么大量的session在超過session.gc_maxlifetime后仍然有效。
session.gc_maxlifetime = 60表示當(dāng)session文件在60秒后沒有被訪問表谊,則視為過期session钞护,等待GC回收。
2爆办、session.gc_probability,session.gc_divisor說明
session.gc_probability 與 session.gc_divisor? 合起來定義了在每個會話初始化時啟動 gc(garbage collection 垃圾回收)進程的概率难咕。此概率用 gc_probability/gc_divisor 計算得來。例如 1/1000 意味著在每個請求中有 0.1% 的概率啟動 gc 進程距辆。如果session.gc_probability = 1000余佃,那么GC進程在每次執(zhí)行session_start()時都會調(diào)用,執(zhí)行收跨算。session.gc_divisor 默認(rèn)為 1000爆土。?
比如:session.gc_maxlifetime=60,session.gc_divisor=1000诸蚕,session.gc_probability=1步势,就表示每一千個用戶調(diào)用session_start()的時候,就百分百的會執(zhí)行一次垃圾回收機制背犯,將磁盤上沒用的session文件刪除坏瘩。
注意:一般對于一些大型的門戶網(wǎng)站,建議將session.gc_divisor調(diào)大一點漠魏,減少開銷
把session.gc_probability/session.gc_divisor的機率提高倔矾,會有幫助,但會對性能造成嚴(yán)重影響柱锹。
3破讨、舉例說明
php.ini配置:
session.gc_maxlifetime = 30
session.gc_divisor ? ? ? ? = 1000
session.gc_probability ? = 1000
因為gc進程被調(diào)用的概率是通過gc_probability/gc_divisor 計算得來的,這里我將session.gc_probability改成1000奕纫,而session.gc_divisor 默認(rèn)情況下也是1000提陶。則gc進程在每次執(zhí)行session_start()函數(shù)的時候都會被調(diào)用到。
開啟兩個會話匹层,如圖
過30秒隙笆,刷新一個人頁面之后,如圖:
雖說效果很明顯升筏,但是線上環(huán)境強烈建議將gc_probability參數(shù)調(diào)低撑柔,使用默認(rèn)值即可,因為太高會影響性能
4您访、嚴(yán)格控制session過期方法
(1)永不過期設(shè)置铅忿,打開php.ini,修改參數(shù)
? ? ? ? ? 1灵汪、session.use_cookies:
? ? ? ? ? ? ? ?把這個的值設(shè)置為1檀训,利用cookie來傳遞sessionid
? ? ? ? ? 2柑潦、session.cookie_lifetime:
? ? ? ? ? ? ? 這個代表SessionID在客戶端Cookie儲存的時間,默認(rèn)是0峻凫,代表瀏覽器一關(guān)閉SessionID就作廢……就? ? ? ? ? ? ? ? 是因為這個所以PHP的 session不能永久使用渗鬼! 那么我們把它設(shè)置為一個我們認(rèn)為很大的數(shù)字吧, ? ? ? ? ? ? ? ? ? ? ? 99999999荧琼。
? ? ? ? ? 3譬胎、session.gc_maxlifetime:
? ? ? ? ? ? ?這個是Session數(shù)據(jù)在服務(wù)器端儲存的時間,如果超過這個時間命锄,那么Session數(shù)據(jù)就自動刪除堰乔! 那么我 ? ? ? ? ? ? ?們也把它設(shè)置為99999999。
(2)
ini_set("session.gc_maxlifetime",24 * 3600);
session_start();
$lifetime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifetime, '/');
$_SESSION['name'] = 'zhang';
echo '設(shè)置成功='.$_SESSION['name'];
(3)
ini_set("session.gc_maxlifetime",24 * 3600);
$lifetime = 24 * 3600;
session_set_cookie_params($lifetime);
session_start();
$_SESSION['num'] = '6055';
echo '設(shè)置成功=='.$_SESSION['num'];
(4)使用memcache/redis來保存session脐恩,設(shè)置過期時間浩考,因為memcache/redis的回收機制不是按機率的,可以確保session過期后失效被盈。
(5)只使用php實現(xiàn)析孽,創(chuàng)建一個session類,在session寫入時只怎,把過期時間也寫入袜瞬。讀取時,根據(jù)過期時間判斷是否已過期身堡。
//Session控制類
classSession{
? ? ? ? ? ? ? /**
? ? ? ? ? ? ? ? * 設(shè)置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:
session_start();
$data='123456';
session::set('test',$data, 10);
echosession::get('test');// 未過期邓尤,輸出
//echosession::get('test');// 已過期
5、清除session(刪除服務(wù)端與客戶端)
session_start();
$_SESSION=array();
if (ini_get("session.use_cookies")) {
? ? ? ? ? ? $params = session_get_cookie_params();
? ? ? ? ? ? setcookie(session_name(), '', time() - 42000,$params["path"], $params["domain"] $params["secure"], $params["httponly"]);
}
session_destroy();