1.php session 有效期
PHP的session有效期默認是1440秒(24分鐘)黄鳍,如果客戶端超過24分鐘沒有刷新,當前session會被回收,失效凸椿。
當用戶關(guān)閉瀏覽器,會話結(jié)束翅溺,session也會失效脑漫。
可以修改php.ini的session.gc_maxlifetime來設(shè)置session的生命周期,但并不能保證在超過這一時間后session信息立即會刪除咙崎。因為GC是按機率啟動的优幸,可能在某一個長時間內(nèi)都沒有被啟動。那么大量的session在超過session.gc_maxlifetime后仍然有效褪猛。
2.session.gc_maxlifetime,session.gc_probability,session.gc_divisor說明
session.gc_maxlifetime = 30 表示當session文件在30秒后沒有被訪問网杆,則視為過期session,等待GC回收伊滋。
GC進程調(diào)用的概率是通過session.gc_probability/session.gc_divisor計算得來的碳却,而session.gc_divisor默認是1000,
如果session.gc_probability = 1000笑旺,那么GC進程在每次執(zhí)行session_start()時都會調(diào)用昼浦,執(zhí)行回收。
把session.gc_probability/session.gc_divisor的機率提高筒主,會有幫助关噪,但會對性能造成嚴重影響鸟蟹。
3.嚴格控制session過期方法
1.使用memcache/Redis來保存session,設(shè)置過期時間使兔,因為memcache/redis的回收機制不是按機率的建钥,可以確保session過期后失效。
2.只使用php實現(xiàn)虐沥,創(chuàng)建一個session類熊经,在session寫入時,把過期時間也寫入欲险。讀取時奈搜,根據(jù)過期時間判斷是否已過期。
<?php
/**
* Session控制類
*/
class Session{
/**
* 設(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--------------------------------------------------------------
<?php
session_start();
$data = '123456';
session::set('test', $data, 10);
echo session::get('test'); // 未過期盯荤,輸出
sleep(10);
echo session::get('test'); // 已過期
?>