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