溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP的session的刪除原理和垃圾處理機(jī)制

發(fā)布時間:2020-05-18 15:36:40 來源:億速云 閱讀:292 作者:Leah 欄目:編程語言

今天小編給大家分享的是PHP的session的刪除原理和垃圾處理機(jī)制,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。

在PHP中,沒有任何變量指向這個對象時,這個對象就成為垃圾。PHP會將其在內(nèi)存中銷毀;這是PHP的GC垃圾處理機(jī)制,防止內(nèi)存溢出。

GC的工作就是掃描所有的Session信息,用當(dāng)前時間減去session最后修改的時間,同session.gc_maxlifetime參數(shù)進(jìn)行比較,如果生存時間超過gc_maxlifetime(默認(rèn)24分鐘),就將該session刪除。

當(dāng)一個有效的請求發(fā)生時,PHP 會根據(jù)全局變量 session.gc_probabilitysession.gc_divisor的值,來決定是否啟用一個GC, 在默認(rèn)情況下,

session.gc_probability = 1
session.gc_divisor = 100

也就是說有1%的可能性啟動GC(也就是說100個請求中只有一個gc會伴隨100個中的某個請求而啟動).

但是,如果你Web服務(wù)器有多個站點(diǎn),多個站點(diǎn)時,GC處理session可能會出現(xiàn)意想不到的結(jié)果,原因就是:GC在工作時,并不會區(qū)分不同站點(diǎn)的session.

那么這個時候怎么解決呢?

1、修改session.save_path,或使用session_save_path()讓每個站點(diǎn)的session保存到一個專用目錄;

2、提高GC的啟動率,當(dāng)GC的啟動率提高,系統(tǒng)的性能也會相應(yīng)減低,不推薦;

3、在代碼中判斷當(dāng)前session的生存時間,利用session_destroy()刪除;

session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440

這三個配置組合構(gòu)建服務(wù)端session的垃圾回收機(jī)制

session.gc_probabilitysession.gc_divisor構(gòu)成執(zhí)行session清理的概率,理論上的解釋為服務(wù)端定期有一定的概率調(diào)用gc函數(shù)來對session進(jìn)行清理,清理的概率為:gc_probability/gc_divisor 比如:1/100 表示每一個新會話初始化時,有

1%的概率會啟動垃圾回收程序,清理的標(biāo)準(zhǔn)為session.gc_maxlifetime定義的時間。

session.gc_divisorsession.gc_probability 合起來定義了在每個會話初始化時啟動 gc(garbage collection 垃圾回收)進(jìn)程的概率。

此概率用 gc_probability/gc_divisor 計(jì)算得來。例如 1/100 意味著在每個請求中有 1% 的概率啟動 gc 進(jìn)程。session.gc_divisor 默認(rèn)為 100。

比如:

session.gc_maxlifetime = 60
session.gc_divisor = 1000
session.gc_probability = 1

就表示每一千個用戶調(diào)用session_start()的時候,就百分百的會執(zhí)行一次垃圾回收機(jī)制,將磁盤上沒用的session文件刪除。

注意:一般對于一些大型的門戶網(wǎng)站,建議將session.gc_divisor調(diào)大一點(diǎn),減少開銷

接下來,我通過一個例子演示下,如何配置才能讓調(diào)用gc(垃圾回收)進(jìn)程呢!

通過配置php.ini文件,修改以下幾個信息:

session.gc_maxlifetime = 60//當(dāng)session文件在60s后還沒有被訪問的話,則該session文件將會被視為“垃圾文件”,并且等待gc(垃圾回收)進(jìn)程的調(diào)用的時候被清理掉
session.gc_probability = 1000

因?yàn)間c進(jìn)程被調(diào)用的概率是通過gc_probability/gc_divisor 計(jì)算得來的,這里我將session.gc_probability改成1000,而session.gc_divisor 默認(rèn)情況下也是1000。則gc進(jìn)程在每次執(zhí)行session_start()函數(shù)的時候都會被調(diào)用到。

開啟三個會話,則創(chuàng)建三個對應(yīng)的session文件,當(dāng)每個文件在60秒內(nèi)都沒被調(diào)用的話,就會被當(dāng)成是“垃圾文件”,等到gc進(jìn)程調(diào)用的時候,“垃圾文件”就會被unlink,因?yàn)橹拔乙呀?jīng)通過修改php.ini配置文件,將gc被調(diào)用的概率改成百分百,所以接下來,如果我重新使用任何一個瀏覽器刷新下頁面的時候,三個session文件,應(yīng)該只剩下一個了

session.save_handler = files

默認(rèn)為file,定義session在服務(wù)端的保存方式,file意為把sesion保存到一個臨時文件里,如果我們想自定義別的方式保存(比如用數(shù)據(jù)庫),則需要把該項(xiàng)設(shè)置為user。

看完上述內(nèi)容,你們對PHP的session的刪除原理和垃圾處理機(jī)制大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI