深入理解session过期机制
生活随笔
收集整理的這篇文章主要介紹了
深入理解session过期机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先得明白: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']并存儲在客戶端。?
明白上面這些,我們可以通過下面的方法修改session的過期時間:?
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']進行訪問!?
???
原文參考:? http://www.jb51.net/article/26890.htm ?
????????????????? http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0621/10583.html
?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']并存儲在客戶端。?
明白上面這些,我們可以通過下面的方法修改session的過期時間:?
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']進行訪問!?
???
原文參考:? http://www.jb51.net/article/26890.htm ?
????????????????? http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0621/10583.html
總結
以上是生活随笔為你收集整理的深入理解session过期机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: make: *** 没有规则可以创建“d
- 下一篇: tp中的M,D,C,A,I,S方法