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值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值