您好,登錄后才能下訂單哦!
今天小編給大家分享的是PHP的session的刪除原理和垃圾處理機制,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,話不多說,一起往下看吧。
在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的session的刪除原理和垃圾處理機制大概了解了嗎?如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。