如何嚴格設定session的過期時間在php環境中
如何嚴格限制session在30分鐘後過期! 1.設定客戶端cookie的lifetime為30分鐘; 2.設定session的最大存活週期也為30分鐘; 3.為每個session值加入時間戳,然後在程式呼叫時進行判斷;
至於為什麼,我們首先來了解下PHP中session的基本原理:
php中的session有效期預設是1440秒(24分鐘),也就是說,客戶端超過24分鐘沒有重新整理,當前session就會失效。當然如果使用者關閉了瀏覽器,會話也就結束了,Session自然也不存在了! 大家知道,Session儲存在伺服器端,根據客戶端提供的SessionID來得到這個使用者的檔案,然後讀取檔案,取得變數的值,SessionID可以使用客戶端的Cookie或者Http1.1協議的 Query_String(就是訪問的URL的“?”後面的部分)來傳送給伺服器,然後伺服器讀取Session的目錄…… 要控制Session的生命週期,首先我們需要了解一下php.ini關於Session的相關設定(開啟php.ini檔案,在“[Session]”部分): 1、session.use_cookies
問題在於,GC在工作時,並不會區分不同站點的session。舉例言之,站點A的gc_maxlifetime設定為2小時,站點B的 gc_maxlifetime設定為預設的24分鐘。當站點B的GC啟動時,它會掃 描公用的臨時檔案目錄,把所有超過24分鐘的session檔案全部刪除掉,而不管它們來自於站點A或B。這樣,站點A的gc_maxlifetime設定就形同虛設了。 找到問題所在,解決起來就很簡單了。修改session.save_path引數,或者使用session_save_path()函式,把儲存session的目錄指向一個專用的目錄,gc_maxlifetime引數工作正常了。
還有一個問題就是,gc_maxlifetime只能保證session生存的最短時間,並不能夠儲存在超過這一時間之後session資訊立即會得到刪除。因為GC是按機率啟動的,可能在某一個長時間內 都沒有被啟動,那麼大量的session在超過gc_maxlifetime以後仍然會有效。 解決這個問題的一個方法是,把session.gc_probability/session.gc_divisor的機率提高,如果提到100%,就會徹底解決這個問題,但顯然會對效能造成嚴重的影響。另一個方法是自己
只使用php實現,建立一個session類,在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.php
session_start();
$data = '123456';
session::set('test', $data, 10);
echo session::get('test'); // 未過期,輸出
sleep(10);
echo session::get('test'); // 已過期