php session 回收,关于php session gc回收的问题
昨天下午糾結,想做一個10秒就自動清除的會話。
雖然后來采用了session+timestamp的方法,但是gc的回收機制卻困擾了我。
根據說明,session的gc是根據以下三個參數。
session_start()是session機制的開始,它有一定概率開啟垃圾回收
'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設置為10,probability 和divisor同時設置為1.
天真的以為10秒后會自動刪除。
(注:win下phpstudy環境)
首先自定義關于php session的三個簡單文件
read.php 讀
write 寫
gc 回收
1、寫入session
session_start();
$_SESSION['nowtime']=date('Y-m-d H:i:s',time());
echo 'session.gc_maxlifetime:'. ini_get('session.gc_maxlifetime')."
";
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
session_start();
echo 'session.gc_maxlifetime:'. ini_get('session.gc_maxlifetime')."
";
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、觸發session_start ,(按照官方說必須觸發start才能開始gc回收)
session_start();
session_write_close();
echo 'session_start execute ';
var_dump($_SESSION);
那么問題來了,用瀏覽器1一次訪問 write,read,gc,然后10秒中之后,再次訪問read。那個sessionid還是在那里一動不動。
后來換了本機其他瀏覽器(瀏覽器2),原來的sessionid就被清除掉了
。但是有個問題,即使我把回收站直接刪除,在用瀏覽器1訪問,sessionid的名字仍然是刪除的那個。不知道他把這個sessionid到底存放在哪里。這些貌似不是大問題,因為一般網站觸發其他的請求后,那么gc回收就起效了。
但是這種放在文件中存儲session,如果遇到百萬或者千萬訪問,gc要開啟100%,他會依次比較當前時間減去mtime的差額,然后與maxlifetime設置的時間做對比。這樣內存開銷還是很大的。
so,那我們只能借助session_set_save_handler() 函數來設置自定義會話保存管理器。
大概流程是這樣:
open:會話開始,調用open管理器
read:讀取已經編碼過的字符串
write:解碼字符串,產生數組對象,放在$_SESSION全局數組變量,然后將session_id 一 起返回,調用close。
destory:會話結束時調用
此外,PHP 會不時地調用 gc 回調函數。 該函數會從持久化存儲中刪除超時的會話數據。
就是設置的maxlifetime值。
總結
以上是生活随笔為你收集整理的php session 回收,关于php session gc回收的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 100根芥末四百一十九是多少钱一根?
- 下一篇: 投浆水的面汤里有菠菜汤可以继续投浆水吗?