PHP設定Session時間

ini_set('session.cookie_lifetime', 0);
來源 Cross-Browser Session Starter
<?php

// $expire = the time in seconds until a session have to expire
function start_session($expire = 0) {
    if ($expire == 0) {
        $expire = ini_get("session.gc_maxlifetime");
    } else {
        ini_set("session.gc_maxlifetime", $expire);
    }
    if (empty($_COOKIE['PHPSESSID'])) {
        session_set_cookie_params($expire);
        session_start();
    } else {
        session_start();
        setcookie("PHPSESSID", session_id(), time() + $expire);
    }
}
// this example will start a session with an expire time given by the php configuration
start_session();
// start_session(600) will start a session which will expire after 10 minutes (60*10 seconds)
?>

有趣的PHP Session機制

網站為了擔心Cross-site Request Forgery(CSRF/XSRF)攻擊,所以在增加csrf-token的session,在執行時判斷網頁的csrf-token值跟session是不是一樣。

不過發現即使設定gc_maxlifetime,仍會有可能出現應該過期的session還在的問題,這才發現原來php沒有一個daemon定時掃描過期的session,而是透過session.gc_probability/session.gc_divisor的設定來決定是否啟動Garbage Collector機制的機率。

解決的方式有幾種:
1.提高session.gc_probability/session.gc_divisor的機率,不過會造成系統的性能降低。

2.如果有更動gc_maxlifetime的話,也要跟著更動session.save_path,或者使用session_save_path()

自己使用了另一個方式,增加了csrf-time,自己檢查過期的話就unset Session。