一、php中session的生成機制php
咱們先來分析一下PHP中是怎麼生成一個session的。設計出session的目的是保持每個用戶的各類狀態來彌補HTTP協議的不足(無狀態)。咱們如今有一個疑問,咱們都知道session是保存在服務器的,既然它用於保持每個用戶的狀態那它利用什麼來區別用戶的呢?這個時候就得藉助cookie了。當咱們在代碼中調用session_start();時,PHP會同時往SESSION的存放目錄(默認爲/tmp/)和客戶端的cookie目錄各生成一個文件。session文件名稱像這樣:html
格式爲sess_{SESSIONID} ,這時session文件中沒有任何內容,當咱們在session_start();添加了這兩行代碼:linux
複製代碼代碼以下:瀏覽器
$_SESSION['name'] = 'wanchun0222';$_SESSION['blog'] = 'coderbolg.net'; 這時文件就有內容了:
複製代碼代碼以下:安全
name|s:11:"wanchun0222";blog|s:13:"coderbolg.net";
這時再看看cookie:服務器
能夠看到服務器爲咱們自動生成了一個cookie,cookie名稱爲"PHPSESSID",cookie內容是一串字符,其實這串字符就是{SESSIONID}。也許你已經明白了,當咱們使用session時,PHP就先生成一個惟一的SESSIONID號(如2bd170b3f86523f1b1b60b55ffde0f66),再在咱們服務器的默認目錄下生成一個文件,文件名爲sess_{SESSIONID},同時在當前用戶的客戶端生成一個cookie,內容已經說過了。這樣PHP會爲每個用戶生成一個SESSIONID,也就是說一個用戶一個session文件。PHP第一次爲某個用戶使用session時就向客戶端寫入了cookie,當這個用戶之後訪問時,瀏覽器會帶上這個cookie,PHP在拿到cookie後就讀出裏面的SESSIONID,拿着這個SESSIONID去session目錄下找session文件。找到後在調用$_SESSION['blog']的時候顯示出來。cookie
二、php中session的過時回收機制session
咱們明白了session的生成及工做原理,發如今session目錄下會有許多session文件。固然這些文件必定不是永遠存在的,PHP必定提供了一種過時回收機制。在php.ini中session.gc_maxlifetime爲session設置了生存時間(默認爲1440s)。若是session文件的最後更新時間到如今超過了生存時間,這個session文件就被認爲是過時的了。在下一次session回收的時候就會被刪除。那下一次session回收是在何時呢?這和php請求次數有關的。在PHP內部機制中,當php被請求了N次後就會有一次觸發回收機制。究竟是請求多少次觸發一次是經過如下兩個參數控制的:.net
複製代碼代碼以下:設計
session.gc_probability = 1session.gc_divisor = 100
這是php.ini的默認設置,意思是每100次PHP請求就有一次回收發生。機率是 gc_probability/gc_divisor 。咱們瞭解了服務器端的session過時機制,再來看看客戶端的cookie的過時機制。
若是cookie失效了瀏覽器天然發送不了cookie到服務器,這時即便服務器的session文件存在也沒用,由於PHP不知道要讀取哪一個session文件。咱們知道PHP的cookie過時時間是在建立時設置的,那麼PHP在建立session的同時爲客戶端建立的cookie的生命週期是多久呢?這個在php.ini中有設置:session.cookie_lifetime 。這個值默認是0,表明瀏覽器一關閉SESSIONID就失效。那就是說咱們把session.gc_maxlifetime和session.cookie_lifetime設置成同一個值就能夠控制session的失效時間了。
三、php中session的客戶端存儲機制
由上面的介紹咱們能夠知道,若是用戶關閉了cookie,那咱們的session就徹底無法工做了。是的,確實是這樣。php中session的客戶端存儲機制只有cookie嗎?不是的。既然咱們的SESSIONID 不能經過cookie傳遞到各個頁面,那咱們還有另外一個法寶,就是經過頁面GET傳值的方式。
PHP能夠在cookie被禁用時自動經過GET方式跨頁傳遞SESSIONID,前提是設置php.ini的session.use_trans_sid爲1。這時當咱們在客戶端禁用了cookie時使用了session,並在當前頁面經過點擊連接到另外一頁面時,PHP會自動在連接上添加SESSIONID參數,像這樣:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。我想你應該看到了這種方式的缺點:好像不夠安全啊。
原文來自:https://www.linuxprobe.com/session-garbage-collection.html