1. 程式人生 > >php-session過期時間設定(設定免登陸過期時間)

php-session過期時間設定(設定免登陸過期時間)

今天用tp框架做一個登陸介面的時候,對於session的過期時間這個問題表費解,例如如何設定一個準確的session過期時間。

通過自己看tp的官方文件,裡面只提到了兩個,但是這兩個一個是session.gc_maxlifetime ,一個是cookie.session_lifetime。但是:

1、session.gc_maxlifetime:session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up. Garbage collection occurs during session start.(session.gc_maxlifetime指定資料在多少秒之後將被視為垃圾並清理掉。 垃圾收集發生在會話開始時。)

  垃圾收集器僅以session.gc_probability除以session.gc_divisor的概率開始使用這些選項的預設值(分別為1和100),機會僅為1%。那麼,你可以簡單地調整這些值,以便更頻繁地啟動垃圾收集器。但是當垃圾回收器啟動時,它會檢查每個註冊會話的有效性。這是成本密集型的​​。此外,當使用PHP的預設session.save_handler檔案時,會話資料將儲存在session.save_path中指定的路徑中的檔案中使用該會話處理程式,會話資料的年齡根據檔案的上次修改日期而不是上次訪問日期進行計算:這裡舉一個例子:假設我5分鐘前設定了一個session_a=1的Session變數, 5分鐘後又設定了一個session_b=2的Seesion變數, 那麼這個Session檔案的修改時間為新增session_b時刻的時間, 那麼session_a就不能在30分鐘的時候, 被清理了。

2、session.cookie_lifetime :session.cookie_lifetime以秒為單位指定傳送給瀏覽器的cookie的生命週期。

  這個過期只是Cookie過期, 換個說法這點就考察Cookie和Session的區別, Session過期是伺服器過期, 而Cookie過期是客戶端(瀏覽器)來保證的, 即使你設定了Cookie過期, 這個只能保證標準瀏覽器到期的時候, 不會發送這個Cookie(包含著Session ID), 而如果通過構造請求, 還是可以使用這個Session ID的值。

如果不使用資料庫來記錄session的過期時間,僅僅使用php,那麼我們可以自己設定一個會話過期時間,在設定session的時候手動新增一個$_ SESSION['create_time']來記錄這個會話建立的時間。然後通過判斷這個create_time的時間戳與當前的時間戳的大小,確定這個session是否過期,如果過期手動刪除session,然後提示使用者重新進行登陸。

示例程式碼如下:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // 會話開始的時間超過30分鐘
    session_regenerate_id(true);    // 使用新生成的會話 ID 更新現有會話 ID 
    $_SESSION['CREATED'] = time();  // 更新會話建立的時間
    // or 提示使用者重新登陸
}
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
//跳轉頁面讓使用者進行登陸
}
如果使用資料庫的話,這裡以mysql為例,可以在mysql的user表中新增一個記錄建立會話的時間,然後每次將這個user表中的這個時間取出來和當前的時間進行比較,判斷會話是否過期。(ps:使用mysql的話速度慢,讀取很耗費資源,所以建議使用快取資料庫。例如memcache、redis等等)