一般情況下,可以通過在頁面提供的一個“退出” 按鈕,單擊來銷毀本次會話。但是使用者如果沒有點擊退出按鈕,而是直接關閉瀏覽器,或者斷網,或者斷電直接關閉電腦等情況下,在伺服器端儲存的 Session 檔案是不會被刪除的。雖然關閉了瀏覽器,下次需要分配一個新的 Session ID 重新登入,但這隻是因為在 php.ini 中的設定
session.cookie_lifetime = 0, 來設定 Session ID 在用戶端 Cookie 中的有效期間限,以秒為單位指定了發送到瀏覽器的 Cookie 的生命週期。值為0 表示 “直到關閉瀏覽器”,預設為 0.
當系統賦予 Session 有效期間限後,不管瀏覽器是否開啟,Session ID 都會自動消失。而用戶端的 Session ID 消失,服務端儲存的 Session 檔案並沒有被刪除。所以沒有被 Session ID 引用 的伺服器端 Session 檔案,就成為 “ 垃圾 ”。 為了防止這些垃圾 Session 檔案對系統造成過大的負荷(因為 Session 並不像 Cookie 是一種半永久性的存在), 對於永遠也用不上的 Session 檔案(垃圾檔案),系統有自動清理的機制。
服務端儲存的 Session 檔案 就是一個普通的文字檔,所以都會有檔案的修改時間。“ 記憶體回收程式 ” 啟動後就是根據 Session 檔案的修改時間 ,將到期的 Session 檔案全都給刪除了。
“ 記憶體回收程式 ” 是什麼樣的啟動機制呢?
“ 記憶體回收程式 ” 是在調用 session_start()函數時啟動的。 而一個網站有多個指令碼,每個指令碼又都要使用 session_start()函數開啟會話,又會有很多個使用者同時訪問,這就很有可能使得 session_start()函數在 1秒內被調用了 N 次,而如果每次都會啟動 “ 記憶體回收程式 ” ,這樣就很不合理了。即使最少控制在 15分鐘以上啟動一次 “ 記憶體回收程式 ” ,一天也要清理 100多次,這樣太頻繁了。 通過在 php.ini 檔案中修改 session.gc_probability 和 session.gc_divisor 兩個選項,設定啟動記憶體回收程式的機率。系統會根據session.gc_probability/session.gc_divisor 公式計算機率,例如選項 session.gc_probability = 1,選項 session.gc_divisor = 100,這樣機率就變成了 1/100,也就是 session_start()函數被調用 100 次才會啟動一次 “ 記憶體回收程式 ” 。所以對會話頁面訪問越頻繁,啟動的機率就越來越小。一般的建議為 調用1000-5000次才會啟動一次: 1/(1000~5000)。