GC的工作就是掃描所有的Session
資訊,用當前時間減去session
最後修改的時間,同session.gc_maxlifetime
引數進行比較,如果生存時間超過gc_maxlifetime
(預設24分鐘),就將該session刪除。
當一個有效的請求發生時,PHP 會根據全域性變數 session.gc_probability
和session.gc_divisor
的值,來決定是否啟用一個GC, 在預設情況下,
session.gc_probability = 1 session.gc_divisor = 100
也就是說有1%的可能性啟動GC(也就是說100個請求中只有一個gc會伴隨100個中的某個請求而啟動).
但是,如果你Web伺服器有多個站點,多個站點時,GC處理session可能會出現意想不到的結果,原因就是:GC在工作時,並不會區分不同站點的session.
那麼這個時候怎麼解決呢?
1、修改session.save_path
,或使用session_save_path()
讓每個站點的session
儲存到一個專用目錄;
2、提高GC的啟動率,當GC的啟動率提高,系統的效能也會相應減低,不推薦;
3、在程式碼中判斷當前session
的生存時間,利用session_destroy()
刪除;
session.gc_probability = 1 session.gc_divisor = 100 session.gc_maxlifetime = 1440
這三個設定組合構建伺服器端session的垃圾回收機制
session.gc_probability
與session.gc_divisor
構成執行session清理的概率,理論上的解釋為伺服器端定期有一定的概率呼叫gc函數來對session進行清理,清理的概率為:gc_probability/gc_divisor
比如:1/100
表示每一個新對談初始化時,有
1%
的概率會啟動垃圾回收程式,清理的標準為session.gc_maxlifetime
定義的時間。
session.gc_divisor
與 session.gc_probability
合起來定義了在每個對談初始化時啟動 gc(garbage collection 垃圾回收)
進程的概率。
此概率用 gc_probability/gc_divisor
計算得來。例如 1/100 意味著在每個請求中有 1%
的概率啟動 gc 進程。session.gc_divisor
預設為 100
。
比如:
session.gc_maxlifetime = 60 session.gc_divisor = 1000 session.gc_probability = 1
就表示每一千個使用者呼叫session_start()
的時候,就百分百的會執行一次垃圾回收機制,將磁碟上沒用的session檔案刪除。
注意:一般對於一些大型的入口網站,建議將session.gc_divisor
調大一點,減少開銷
接下來,我通過一個例子演示下,如何設定才能讓呼叫gc(垃圾回收)進程呢!
通過設定php.ini檔案,修改以下幾個資訊:
session.gc_maxlifetime = 60//當session檔案在60s後還沒有被存取的話,則該session檔案將會被視為「垃圾檔案」,並且等待gc(垃圾回收)進程的呼叫的時候被清理掉 session.gc_probability = 1000
因為gc進程被呼叫的概率是通過gc_probability/gc_divisor
計算得來的,這裡我將session.gc_probability
改成1000
,而session.gc_divisor 預設情況下也是1000
。則gc進程在每次執行session_start()函數的時候都會被呼叫到。
開啟三個對談,則建立三個對應的session
檔案,當每個檔案在60秒內都沒被呼叫的話,就會被當成是「垃圾檔案」,等到gc進程呼叫的時候,「垃圾檔案」就會被unlink
,因為之前我已經通過修改php.ini
組態檔,將gc被呼叫的概率改成百分百,所以接下來,如果我重新使用任何一個瀏覽器重新整理下頁面的時候,三個session
檔案,應該只剩下一個了
session.save_handler = files
預設為file,定義session在伺服器端的儲存方式,file
意為把sesion
儲存到一個臨時檔案裡,如果我們想自定義別的方式儲存(比如用資料庫),則需要把該項設定為user
。
相關推薦:《PHP教學》
以上就是php session垃圾回收機制的詳細內容,更多請關注TW511.COM其它相關文章!