php中Session的自動回收機制詳解

一般情況下,可以通過在頁面提供的一個“退出” 按鈕,單擊來銷燬本次會話。但是用戶如果沒有點擊退出按鈕,而是直接關閉瀏覽器,或者斷網,或者斷電直接關閉計算機等情況下,在服務器端保存的 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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章