首先得明白:
session 的過期時(shí)間由兩方面決定的;
存儲在客戶端的
$_COOKIE[‘PHPSESSID’]
的過期時(shí)間(默認(rèn)cookie名稱為PHPSESSID
,可通過php.ini
中的session.name
修改跃捣。)存儲在服務(wù)器端的相對應(yīng)的
session
文件(session 文件名和上述 cookie的值一一對應(yīng)),默認(rèn)為 1440 秒茂装,即 24 分鐘
ok伦籍,現(xiàn)在詳細(xì)闡述上述兩者的關(guān)系: 當(dāng)執(zhí)行 session_start()
的時(shí)候,其實(shí)是做了兩件事:
- 檢查客戶端發(fā)送過來的的所有 cookie(當(dāng)然也包括
$_COOKIE[‘PHPSESSID’]
, 如果有的話)贷痪,根據(jù)$_COOKIE[‘PHPSESSID’]
的值(這是由 apache 產(chǎn)生的隨機(jī)字符串幻妓,如 0lkbd2se458r600m2m7o1r4ic5)來訪問 相對應(yīng)的 session文件(如:sess_0lkbd2se458r600m2m7o1r4ic5,我的默認(rèn)存儲在‘E:\wamp\tmp’下)劫拢,這兩者是一 一對應(yīng)的關(guān)系肉津。打個(gè)比喻:
$_COOKIE[‘PHPSESSID’] 就是一把開啟寶盒的鑰匙,而那個(gè)寶盒就是 session 文件舱沧,里面存儲著用戶的重要 信息妹沙,也就是 session 的值, 如:$_SESSION[‘uid’]=1, $_SESSION[‘username’]=’name’, $_SESSION[‘pwd’]=’pwd’, 當(dāng)然文件里面的值是經(jīng)過序列化的熟吏。
- 如果客戶端沒有傳來
$_COOKIE[‘PHPSESSID’]
距糖,就會有服務(wù)端產(chǎn)生一個(gè)隨機(jī)的$_COOKIE[‘PHPSESSID’]
并存儲在客戶端。
明白上面這些牵寺,我們可以通過下面的方法修改 session 的過期時(shí)間:
// 修改 $_COOKIE[‘PHPSESSID’] 的生存時(shí)間為50秒
session_set_cookie_params(’50’);
// 或者可以這樣:
setcookie(session_name(), session_id(), time()+50);
// 設(shè)置 session 文件的有效時(shí)間為 50 秒
ini_set(‘session.gc_maxlifetime’, ’50’);
但是悍引,可能有些朋友會做這樣一個(gè)試驗(yàn), 在 50 秒內(nèi)獲取 $_COOKIE[‘PHPSESSID’]
的值并記錄下來(如黑客截獲這個(gè) cookie)缸剪,這樣等 50 秒過后發(fā)現(xiàn)原先的 $_COOKIE[‘PHPSESSID’]
值確實(shí)不存在了吗铐,而出現(xiàn)了一個(gè)新的 $_COOKIE[‘PHPSESSID’]
,但是 ‘E:\wamp \tmp’ 下的舊 session 文件卻沒有消失(默認(rèn)只有 1/1000 的概率會消失杏节,應(yīng)該不會碰到吧唬渗,呵呵),這是為什么呢奋渔?我不是已經(jīng)設(shè)置了 .ini_set(‘session.gc_maxlifetime’,’50’);
了嗎镊逝?再做一個(gè)實(shí)驗(yàn):這時(shí)你偽造一個(gè) $_COOKIE[‘PHPSESSID’]
, 值為剛才你記錄下的,神奇的事發(fā)生了嫉鲸,你依然可以訪問剛才舊的 session 文件3潘狻!P(雖然他已經(jīng)過期)座菠,只要這個(gè)文件沒被刪除,用相對應(yīng)得 $_COOKIE[‘PHPSESSID’]
依然可以進(jìn)行訪問L偈鳌T〉巍!
那我們設(shè)置 ini_set(‘session.gc_maxlifetime’, ’50’);
還有什么意義呢岁钓?這就涉及的 GC(GarbageCollector) 的回收機(jī)制升略。
默認(rèn)情況下微王,session.gc_probability = 1
,session.gc_divisor=1000
品嚣,也就是說有 1/1000 的可能性會啟動 GC炕倘。GC 的工作,就是掃描所有的 session 信息翰撑,用當(dāng)前時(shí)間減去 session 的最后修改時(shí)間(modifieddate)罩旋,同session.gc_maxlifetime
參數(shù)進(jìn)行比較,如果生存時(shí)間已經(jīng)超過gc_maxlifetime
额嘿,就把該 session 刪除瘸恼。只要沒有啟動 GC,即使 session 過期册养,也仍舊可通過相對應(yīng)得 $_COOKIE[‘PHPSESSID’]
進(jìn)行訪問东帅!