深入理解session過期機制

2021-09-30 13:35:39 字數 1847 閱讀 2916

首先得明白:session的過期時間由兩方面決定的; 

1儲存在客戶端的$_cookie['phpsessid']的過期時間(預設cookie名稱為phpsessid,可通過php.ini中的session.name修改。) 

2.儲存在伺服器端的相對應的session檔案(session檔名和上述cookie的值一一對應),預設為1440秒,即24分鐘 

ok,現在詳細闡述上述兩者的關係: 

當執行session_start()的時候

,其實是做了兩件事: 

1,檢查客戶端傳送過來的的所有cookie(當然也包括$_cookie['phpsessid'], 

如果有的話

),根據$_cookie['phpsessid']的值(這是由apache產生的隨機字串,如0lkbd2se458r600m2m7o1r4ic5)來訪問 

相對應的 session檔案(如:sess_0lkbd2se458r600m2m7o1r4ic5,我的預設儲存在『e:\wamp\tmp』下),這兩者是一 一對應的關係。打個比喻:$_cookie['phpsessid']就是一把開啟寶盒的鑰匙,而那個寶盒就是session檔案,裡面儲存著使用者的重要 資訊,也就是session的值, 如:$_session['uid']=1,$_session['username']='name',$_session['pwd']='pwd', 當然檔案裡面的值是經過序列化的。 

2,如果客戶端沒有傳來$_cookie['phpsessid'],就會有服務端產生乙個隨機的$_cookie['phpsessid']並儲存在客戶端。 

1.session_set_cookie_params('50');//修改$_cookie['phpsessid'],的生存時間為50秒

(或者可以這樣:

setcookie(session_name(),session_id(),time()+50);)

2.ini_set('session.gc_maxlifetime','50');//設定session檔案的有效時間為50秒

但是,可能有些朋友會做這樣 

乙個試驗

, 在50秒內獲取$_cookie['phpsessid']的值並記錄下來(如黑客截獲這個cookie),這樣等50秒過後發現原先 的$_cookie['phpsessid']值確實不存在了,而出現了乙個新的$_cookie['phpsessid'],但是『e:\wamp \tmp』下的舊session檔案卻沒有消失(預設只有1/1000的概率會消失,應該不會碰到吧,呵呵),這是為什麼呢?我不是已經設定了 

.ini_set('session.gc_maxlifetime','50');了 嗎?再做乙個實驗:這時你偽造乙個$_cookie['phpsessid'],值為剛才你記錄下的,神奇的事發生了,你依然可以訪問剛才舊的 session檔案!!!(雖然他已經過期),只要這個檔案沒被刪除,用相對應得$_cookie['phpsessid']依然可以進行訪問!!!

那我們設定ini_set('session.gc_maxlifetime', '50');還有什麼意義呢

?這就涉及的gc(garbagecollector)的**機制。 

默 認情況下,session.gc_probability = 1,session.gc_divisor=1000,也就是說有1/1000的可能性會啟動gc。gc的工作,就是掃瞄所有的session資訊,用當 前時間減去session的最後修改時間(modifieddate),同session.gc_maxlifetime引數進行比較,如果生存時間已經 超過gc_maxlifetime,就把該session刪除。只要沒有啟動gc,即使session過期,也仍舊可通過相對應 得$_cookie['phpsessid']進行訪問! 

原文參考: 

深入理解session和cookie

理解乙個東西首先要知道它的由來,也就是為什麼會需要它,它的作用是什麼。cookie 隨著web的不斷發展,需求也在不斷的變化,從最初的全靜態頁面到後面的動態頁面。因為http協議是乙個無狀態的協議,當使用者的一次訪問結束後,後端伺服器就無法知道下一次來訪問的還是不是上一次訪問的使用者。由此w3c組織...

深入理解Android Binder機制的幾點

android系統binder機制中的四個元件 client,server,service manager和binder驅動程式。1.client server和service manager實現在使用者空間中,binder驅動程式實現在核心空間中 2.binder驅動程式和service mana...

深入理解共享記憶體機制

共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。是針對其他通訊機制執行效率較低而設計的。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某...