首頁  >  文章  >  後端開發  >  php session垃圾回收機制

php session垃圾回收機制

藏色散人
藏色散人轉載
2020-05-16 13:32:442088瀏覽

在PHP中,沒有任何變數指向這個物件時,這個物件就變成垃圾。 PHP會將其在記憶體中銷毀;這是PHP的GC垃圾處理機制,防止記憶體溢出。

GC的工作就是掃描所有的Session訊息,用目前時間減去session最後修改的時間,同session.gc_maxlifetime參數進行比較,如果生存時間超過gc_maxlifetime(預設24分鐘),就將該session刪除。

當一個有效的請求發生時,PHP 會根據全域變數session.gc_probabilitysession.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_probabilitysession.gc_divisor構成執行session清理的機率,理論上的解釋為服務端定期有一定的機率呼叫gc函數來對session進行清理,清理的機率為: gc_probability/gc_divisor 例如:1/100 表示每一個新會話初始化時,有

1%的機率會啟動垃圾回收程序,清理的標準為session.gc_maxlifetime定義的時間。

session.gc_divisorsession.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中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除