摘要:昨天下午糾結(jié),想做一個(gè)秒就自動(dòng)清除的會(huì)話。注下環(huán)境首先自定義關(guān)于的三個(gè)簡(jiǎn)單文件讀寫(xiě)回收寫(xiě)入讀取和觸發(fā)按照官方說(shuō)必須觸發(fā)才能開(kāi)始回收那么問(wèn)題來(lái)了,用瀏覽器一次訪問(wèn),,,然后秒中之后,再次訪問(wèn)。會(huì)話結(jié)束時(shí)調(diào)用此外,會(huì)不時(shí)地調(diào)用回調(diào)函數(shù)。
昨天下午糾結(jié),想做一個(gè)10秒就自動(dòng)清除的會(huì)話。
雖然后來(lái)采用了session+timestamp的方法,但是gc的回收機(jī)制卻困擾了我。
根據(jù)說(shuō)明,session的gc是根據(jù)以下三個(gè)參數(shù)。
session_start()是session機(jī)制的開(kāi)始,它有一定概率開(kāi)啟垃圾回收
"session.gc_maxlifetime:". ini_get("session.gc_maxlifetime")."
"; "session.gc_probability:". ini_get("session.gc_probability")."
"; "session.gc_divisor:". ini_get("session.gc_divisor")."
";
于是我把maxlifetime設(shè)置為10,probability 和divisor同時(shí)設(shè)置為1.
天真的以為10秒后會(huì)自動(dòng)刪除。
(注:win下phpstudy環(huán)境)
首先自定義關(guān)于php session的三個(gè)簡(jiǎn)單文件
read.php 讀
write 寫(xiě)
gc 回收
1、寫(xiě)入session
"; echo "session.gc_probability:". ini_get("session.gc_probability")."
"; echo "session.gc_divisor:". ini_get("session.gc_divisor")."
"; echo "session-id:".session_id()."
"; echo "session-name:".session_name()."
"; echo "
"; echo "write success in ".date("Y-m-d H:i:s",time()); session_write_close();
2、讀取session和cookie
"; echo "session.gc_probability:". ini_get("session.gc_probability")."
"; echo "session.gc_divisor:". ini_get("session.gc_divisor")."
"; echo "
"."Session::=>"; var_dump($_SESSION); echo "
"."Cookie::=>"; var_dump($_COOKIE); echo "
"; echo "
ReadTime".date("Y-m-d H:i:s",time());
3、觸發(fā)session_start ,(按照官方說(shuō)必須觸發(fā)start才能開(kāi)始gc回收)
那么問(wèn)題來(lái)了,用瀏覽器1一次訪問(wèn) write,read,gc,然后10秒中之后,再次訪問(wèn)read。那個(gè)sessionid還是在那里一動(dòng)不動(dòng)。
后來(lái)?yè)Q了本機(jī)其他瀏覽器(瀏覽器2),原來(lái)的sessionid就被清除掉了
。但是有個(gè)問(wèn)題,即使我把回收站直接刪除,在用瀏覽器1訪問(wèn),sessionid的名字仍然是刪除的那個(gè)。不知道他把這個(gè)sessionid到底存放在哪里。這些貌似不是大問(wèn)題,因?yàn)橐话憔W(wǎng)站觸發(fā)其他的請(qǐng)求后,那么gc回收就起效了。
但是這種放在文件中存儲(chǔ)session,如果遇到百萬(wàn)或者千萬(wàn)訪問(wèn),gc要開(kāi)啟100%,他會(huì)依次比較當(dāng)前時(shí)間減去mtime的差額,然后與maxlifetime設(shè)置的時(shí)間做對(duì)比。這樣內(nèi)存開(kāi)銷還是很大的。so,那我們只能借助session_set_save_handler() 函數(shù)來(lái)設(shè)置自定義會(huì)話保存管理器。
大概流程是這樣:
open:會(huì)話開(kāi)始,調(diào)用open管理器
read:讀取已經(jīng)編碼過(guò)的字符串
write:解碼字符串,產(chǎn)生數(shù)組對(duì)象,放在$_SESSION全局?jǐn)?shù)組變量,然后將session_id 一 起返回,調(diào)用close。
destory:會(huì)話結(jié)束時(shí)調(diào)用
此外,PHP 會(huì)不時(shí)地調(diào)用 gc 回調(diào)函數(shù)。 該函數(shù)會(huì)從持久化存儲(chǔ)中刪除超時(shí)的會(huì)話數(shù)據(jù)。
就是設(shè)置的maxlifetime值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21026.html
摘要:主要被用于保存某個(gè)訪問(wèn)者的數(shù)據(jù)。服務(wù)器給訪問(wèn)者唯一的鑰匙,這個(gè)鑰匙被稱作。例如官方給出的方案對(duì)于大量使用或者并發(fā)請(qǐng)求的網(wǎng)站而言,這可能是一個(gè)嚴(yán)重的問(wèn)題。例如意味著在每個(gè)請(qǐng)求中有的概率啟動(dòng)進(jìn)程。因此對(duì)于不能跟蹤的文件系統(tǒng)也沒(méi)問(wèn)題了。 什么是 Session 在 web 應(yīng)用開(kāi)發(fā)中,Session 被稱為會(huì)話。主要被用于保存某個(gè)訪問(wèn)者的數(shù)據(jù)。 由于 HTTP 無(wú)狀態(tài)的特點(diǎn),服務(wù)端是不會(huì)記...
摘要:的作用就是為了解決協(xié)議無(wú)狀態(tài)的缺陷所作的努力。的內(nèi)容主要包括名字,值,過(guò)期時(shí)間,路徑和域。這種生命期為瀏覽器會(huì)話期的被稱為會(huì)話。而機(jī)制采用的是一種在服務(wù)器端保持狀態(tài)的解決方案。中的有效期默認(rèn)分鐘,也就是說(shuō),客戶端超過(guò)分鐘,當(dāng)前就會(huì)失效。 會(huì)話控制是什么? cookie和session都是跟蹤整個(gè)會(huì)話過(guò)程的技術(shù)手段。而會(huì)話,就是用戶通過(guò)瀏覽器和服務(wù)器的一次通話。 為什么要有會(huì)話控制? 因...
摘要:一下大多是網(wǎng)上的資料,自己只是整理了下,如果有錯(cuò)誤希望能指出,感謝中的相關(guān)配置先看下中的相關(guān)配置的解釋。啟用此設(shè)定可以防止有關(guān)通過(guò)傳遞會(huì)話的攻擊。值為表示直到關(guān)閉瀏覽器。例如意味著在每個(gè)請(qǐng)求中有的概率啟動(dòng)進(jìn)程。 對(duì)于session的了解,之前一直沒(méi)有仔細(xì)研究過(guò),最近遇到了一些問(wèn)題,需要解決session配置問(wèn)題,就順便查看了些資料。一下大多是網(wǎng)上的資料,自己只是整理了下,如果有錯(cuò)誤希望...
閱讀 2303·2021-10-13 09:39
閱讀 3426·2021-09-30 09:52
閱讀 811·2021-09-26 09:55
閱讀 2783·2019-08-30 13:19
閱讀 1902·2019-08-26 10:42
閱讀 3198·2019-08-26 10:17
閱讀 552·2019-08-23 14:52
閱讀 3648·2019-08-23 14:39