一般情況下,可透過在頁面提供的一個「退出」 按鈕,點選來銷毀本次會話。但是使用者如果沒有點選退出按鈕,而是直接關閉瀏覽器,或斷網,或斷電直接關閉電腦等情況下,在伺服器端儲存的 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)。
以上是php中Session的自動回收機制詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!