如何嚴格設置php中session過期時間

      網友投稿 905 2025-04-01

      如何嚴格限制session在30分鐘后過期!

      1.設置客戶端cookie的lifetime為30分鐘;

      2.設置session的最大存活周期也為30分鐘;

      3.為每個session值加入時間戳,然后在程序調用時進行判斷;

      至于為什么,我們首先來了解下PHP中session的基本原理:

      php中的session有效期默認是1440秒(24分鐘),也就是說,客戶端超過24分鐘沒有刷新,當前session就會失效。當然如果用戶關閉了瀏覽器,會話也就結束了,Session自然也不存在了!

      大家知道,Session儲存在服務器端,根據客戶端提供的SessionID來得到這個用戶的文件,然后讀取文件,取得變量的值,SessionID可以使用客戶端的Cookie或者Http1.1協議的

      Query_String(就是訪問的URL的“?”后面的部分)來傳送給服務器,然后服務器讀取Session的目錄……

      要控制Session的生命周期,首先我們需要了解一下php.ini關于Session的相關設置(打開php.ini文件,在“[Session]”部分):

      1、session.use_cookies:默認的值是“1”,代表SessionID使用Cookie來傳遞,反之就是使用Query_String來傳遞;

      2、session.name:這個就是SessionID儲存的變量名稱,可能是Cookie,也可能是Query_String來傳遞,默認值是“PHPSESSID”;

      3、session.cookie_lifetime:這個代表SessionID在客戶端Cookie儲存的時間,默認是0,代表瀏覽器一關閉SessionID就作廢……就是因為這個所以Session不能永久使用!

      4、session.gc_maxlifetime:這個是Session數據在服務器端儲存的時間,如果超過這個時間,那么Session數據就自動刪除!

      還有很多的設置,不過和本文相關的就是這些了,下面開始講如何設置Session的存活周期。

      如何嚴格設置php中session過期時間

      前面說過,服務器通過SessionID來讀取Session的數據,但是一般瀏覽器傳送的SessionID在瀏覽器關閉后就沒有了,那么我們只需要人為的設置SessionID并且保存下來,不就可以……

      如果你擁有服務器的操作權限,那么設置這個非常非常的簡單,只是需要進行如下的步驟:

      1、把“session.use_cookies”設置為1,使用Cookie來儲存SessionID,不過默認就是1,一般不用修改;

      2、把“session.cookie_lifetime”改為你需要設置的時間(比如一個小時,就可以設置為3600,以秒為單位);

      3、把“session.gc_maxlifetime”設置為和“session.cookie_lifetime”一樣的時間;

      在PHP的文檔中明確指出,設定session有效期的參數是session.gc_maxlifetime。可以在php.ini文件中,或者通過ini_set()函數來修改這一參數。問題在于,經過多次測試,修改這個

      參數基本不起作用,session有效期仍然保持24分鐘的默認值。

      由于PHP的工作機制,它并沒有一個daemon線程,來定時地掃描session信息并判斷其是否失效。當一個有效請求發生時,PHP會根據全局變量

      session.gc_probability/session.gc_divisor(同樣可以通過php.ini或者ini_set()函數來修改)的值,來決定是否啟動一個GC(Garbage Collector)。

      默認情況下,session.gc_probability = 1,session.gc_divisor =100,也就是說有1%的可能性會啟動GC。GC的工作,就是掃描所有的session信息,用當前時間減去session的最后修

      改時間(modified date),同session.gc_maxlifetime參數進行比較,如果生存時間已經超過gc_maxlifetime,就把該session刪除。

      到此為止,工作一切正常。那為什么會發生gc_maxlifetime無效的情況呢?

      在默認情況下,session信息會以文本文件的形式,被保存在系統的臨時文件目錄中。在Linux下,這一路徑通常為\tmp,在 Windows下通常為C:\Windows\Temp。當服務器上有多個PHP應

      用時,它們會把自己的session文件都保存在同一個目錄中。同樣地,這些PHP應用也會按一定機率啟動GC,掃描所有的session文件。

      問題在于,GC在工作時,并不會區分不同站點的session。舉例言之,站點A的gc_maxlifetime設置為2小時,站點B的 gc_maxlifetime設置為默認的24分鐘。當站點B的GC啟動時,它會掃

      描公用的臨時文件目錄,把所有超過24分鐘的session文件全部刪除掉,而不管它們來自于站點A或B。這樣,站點A的gc_maxlifetime設置就形同虛設了。

      找到問題所在,解決起來就很簡單了。修改session.save_path參數,或者使用session_save_path()函數,把保存session的目錄指向一個專用的目錄,gc_maxlifetime參數工作正常了。

      還有一個問題就是,gc_maxlifetime只能保證session生存的最短時間,并不能夠保存在超過這一時間之后session信息立即會得到刪除。因為GC是按機率啟動的,可能在某一個長時間內

      都沒有被啟動,那么大量的session在超過gc_maxlifetime以后仍然會有效。

      解決這個問題的一個方法是,把session.gc_probability/session.gc_divisor的機率提高,如果提到100%,就會徹底解決這個問題,但顯然會對性能造成嚴重的影響。另一個方法是自己

      只使用php實現,創建一個session類,在session寫入時,把過期時間也寫入。讀取時,根據過期時間判斷是否已過期。

      class Session{ /** * 設置session * @param String $name session name * @param Mixed $data session data * @param Int $expire 超時時間(秒) */ public static function set($name, $data, $expire=600){ $session_data = array(); $session_data['data'] = $data; $session_data['expire'] = time()+$expire; $_SESSION[$name] = $session_data; } /** * 讀取session * @param String $name session name * @return Mixed */ public static function get($name){ if(isset($_SESSION[$name])){ if($_SESSION[$name]['expire']>time()){ return $_SESSION[$name]['data']; }else{ self::clear($name); } } return false; } /** * 清除session * @param String $name session name */ private static function clear($name){ unset($_SESSION[$name]); } } demo.php session_start(); $data = '123456'; session::set('test', $data, 10); echo session::get('test'); // 未過期,輸出 sleep(10); echo session::get('test'); // 已過期

      PHP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS中表格中文字顯示不全怎么解決(wps表格里面文字顯示不全)
      下一篇:通過匹配Excel中的多個列來為值編制索引
      相關文章
      亚洲精品二三区伊人久久| 亚洲精品人成电影网| 亚洲一区二区三区在线观看精品中文| 亚洲伊人久久大香线蕉AV| 亚洲高清在线观看| 国产亚洲高清不卡在线观看| 亚洲?v女人的天堂在线观看| 亚洲av无码一区二区三区人妖| 亚洲人成在线观看| 亚洲成在人天堂一区二区| 亚洲午夜久久久久久久久久| 中文字幕亚洲一区二区va在线| 亚洲国产精品一区二区第一页免| 久久亚洲精品11p| 亚洲大尺度无码无码专线一区| 亚洲第一成人在线| 亚洲熟妇AV日韩熟妇在线| 久久亚洲国产成人影院| 亚洲欧美国产国产一区二区三区 | 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲五月综合缴情在线观看| 亚洲一区无码精品色| 久久久久亚洲爆乳少妇无| 国产亚洲精品不卡在线| 亚洲色WWW成人永久网址| 亚洲国产精品无码久久久秋霞2 | 亚洲人成色7777在线观看| 国产亚洲精品岁国产微拍精品 | 一本色道久久88亚洲精品综合| 亚洲中文字幕无码久久2020| 亚洲av综合av一区二区三区| 国产精品亚洲一区二区无码 | 午夜亚洲国产精品福利| 精品国产亚洲男女在线线电影| 国产亚洲精品一品区99热| 亚洲情a成黄在线观看动漫尤物| 亚洲白嫩在线观看| 亚洲中文字幕无码爆乳app| 噜噜综合亚洲AV中文无码| 亚洲精品97久久中文字幕无码| 亚洲综合在线另类色区奇米|