php中session垃圾回收機(jī)制
在PHP中,沒有任何變量指向這個(gè)對象時(shí),這個(gè)對象就成為垃圾。PHP會將其在內(nèi)存中銷毀;這是PHP的GC垃圾處理機(jī)制,防止內(nèi)存溢出。
GC的工作就是掃描所有的Session信息,用當(dāng)前時(shí)間減去session最后修改的時(shí)間,同session.gc_maxlifetime參數(shù)進(jìn)行比較,如果生存時(shí)間超過gc_maxlifetime(默認(rèn)24分鐘),就將該session刪除。
當(dāng)一個(gè)有效的請求發(fā)生時(shí),PHP 會根據(jù)全局變量 session.gc_probability和session.gc_divisor的值,來決定是否啟用一個(gè)GC, 在默認(rèn)情況下,session.gc_probability=1, session.gc_divisor =100也就是說有1%的可能性啟動(dòng)GC(也就是說100個(gè)請求中只有一個(gè)gc會伴隨100個(gè)中的某個(gè)請求而啟動(dòng)).
但是,如果你Web服務(wù)器有多個(gè)站點(diǎn),多個(gè)站點(diǎn)時(shí),GC處理session可能會出現(xiàn)意想不到的結(jié)果,原因就是:GC在工作時(shí),并不會區(qū)分不同站點(diǎn)的session.
那么這個(gè)時(shí)候怎么解決呢?
修改session.save_path,或使用session_save_path()讓每個(gè)站點(diǎn)的session保存到一個(gè)專用目錄,
提供GC的啟動(dòng)率,自然,GC的啟動(dòng)率提高,系統(tǒng)的性能也會相應(yīng)減低,不推薦。
在代碼中判斷當(dāng)前session的生存時(shí)間,利用session_destroy()刪除.
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440
這三個(gè)配置組合構(gòu)建服務(wù)端session的垃圾回收機(jī)制
session.gc_probability與session.gc_divisor構(gòu)成執(zhí)行session清理的概率,理論上的解釋為服務(wù)端定期有一定的概率調(diào)用gc函數(shù)來對session進(jìn)行清理,清理的概率為:gc_probability/gc_divisor 比如:1/100 表示每一個(gè)新會話初始化時(shí),有1%的概率會啟動(dòng)垃圾回收程序,清理的標(biāo)準(zhǔn)為session.gc_maxlifetime定義的時(shí)間。
session.gc_divisor 與 session.gc_probability 合起來定義了在每個(gè)會話初始化時(shí)啟動(dòng) gc(garbage collection 垃圾回收)進(jìn)程的概率。此概率用 gc_probability/gc_divisor 計(jì)算得來。例如 1/100 意味著在每個(gè)請求中有 1% 的概率啟動(dòng) gc 進(jìn)程。session.gc_divisor 默認(rèn)為 100。
比如:session.gc_maxlifetime=30,session.gc_divisor=1000,session.gc_probability=1,就表示每一千個(gè)用戶調(diào)用session_start()的時(shí)候,就百分百的會執(zhí)行一次垃圾回收機(jī)制,將磁盤上沒用的session文件刪除。
注意:一般對于一些大型的門戶網(wǎng)站,建議將session.gc_divisor調(diào)大一點(diǎn),減少開銷。接下來,我通過一個(gè)例子演示下,如何配置才能讓調(diào)用gc(垃圾回收)進(jìn)程呢!
通過配置php.ini文件,修改以下幾個(gè)信息:
session.gc_maxlifetime = 60//當(dāng)session文件在60s后還沒有被訪問的話,則該session文件將會被視為“垃圾文件”,并且等待gc(垃圾回收)進(jìn)程的調(diào)用的時(shí)候被清理掉,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ù)的時(shí)候都會被調(diào)用到。
開啟三個(gè)會話,則創(chuàng)建三個(gè)對應(yīng)的session文件,當(dāng)每個(gè)文件在30秒內(nèi)都沒被調(diào)用的話,就會被當(dāng)成是“垃圾文件”,等到gc進(jìn)程調(diào)用的時(shí)候,“垃圾文件”就會被unlink,因?yàn)橹拔乙呀?jīng)通過修改php.ini配置文件,將gc被調(diào)用的概率改成百分百,所以接下來,如果我重新使用任何一個(gè)瀏覽器刷新下頁面的時(shí)候,三個(gè)session文件,應(yīng)該只剩下一個(gè)了session.save_handler = files,默認(rèn)為file,定義session在服務(wù)端的保存方式,file意為把sesion保存到一個(gè)臨時(shí)文件里,如果我們想自定義別的方式保存(比如用數(shù)據(jù)庫),則需要把該項(xiàng)設(shè)置為user。
相關(guān)文章
php版微信公眾平臺回復(fù)中文出現(xiàn)亂碼問題的解決方法
這篇文章主要介紹了php版微信公眾平臺回復(fù)中文出現(xiàn)亂碼問題的解決方法,涉及php字符串編碼轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下2016-09-09php實(shí)現(xiàn)通用的信用卡驗(yàn)證類
這篇文章主要介紹了php實(shí)現(xiàn)通用的信用卡驗(yàn)證類,涉及信用卡的規(guī)則與php字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,文中有英文原文注釋說明,有助于更直觀的了解源碼相關(guān)信息,需要的朋友可以參考下2015-03-03php+ajax實(shí)時(shí)刷新簡單實(shí)例
這篇文章主要介紹了php+ajax實(shí)時(shí)刷新簡單實(shí)現(xiàn)方法,實(shí)例分析了Ajax的實(shí)現(xiàn)原理以及對應(yīng)的php處理文件基本原理與操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02php 數(shù)組排序 array_multisort與uasort的區(qū)別
其實(shí),簡單的說兩者的最重要的區(qū)別:array_multisort()排序之后,原數(shù)組“鍵”丟失。uasort()排序之后,保留原來的“鍵”。2011-03-03解決form中action屬性后面?傳遞參數(shù) 獲取不到的問題
下面小編就為大家?guī)硪黄鉀Qform中action屬性后面?傳遞參數(shù) 獲取不到的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07