在PHP中,沒有任何變數指向這個物件時,這個物件就變成垃圾。 PHP會將其在記憶體中銷毀;這是PHP的GC垃圾處理機制,防止記憶體溢出。
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垃圾回收機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!