资讯专栏INFORMATION COLUMN

关于php session gc回收的问题

codecook / 2406人阅读

摘要:昨天下午纠结,想做一个秒就自动清除的会话。注下环境首先自定义关于的三个简单文件读写回收写入读取和触发按照官方说必须触发才能开始回收那么问题来了,用浏览器一次访问,,,然后秒中之后,再次访问。会话结束时调用此外,会不时地调用回调函数。

昨天下午纠结,想做一个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

";
    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、触发session_start ,(按照官方说必须触发start才能开始gc回收)


那么问题来了,用浏览器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值。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21026.html

相关文章

  • 关于 PHPSession 几个问题

    摘要:主要被用于保存某个访问者的数据。服务器给访问者唯一的钥匙,这个钥匙被称作。例如官方给出的方案对于大量使用或者并发请求的网站而言,这可能是一个严重的问题。例如意味着在每个请求中有的概率启动进程。因此对于不能跟踪的文件系统也没问题了。 什么是 Session 在 web 应用开发中,Session 被称为会话。主要被用于保存某个访问者的数据。 由于 HTTP 无状态的特点,服务端是不会记...

    CoyPan 评论0 收藏0
  • session和cookie

    摘要:的作用就是为了解决协议无状态的缺陷所作的努力。的内容主要包括名字,值,过期时间,路径和域。这种生命期为浏览器会话期的被称为会话。而机制采用的是一种在服务器端保持状态的解决方案。中的有效期默认分钟,也就是说,客户端超过分钟,当前就会失效。 会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段。而会话,就是用户通过浏览器和服务器的一次通话。 为什么要有会话控制? 因...

    ruicbAndroid 评论0 收藏0
  • phpsession相关设置描述

    摘要:一下大多是网上的资料,自己只是整理了下,如果有错误希望能指出,感谢中的相关配置先看下中的相关配置的解释。启用此设定可以防止有关通过传递会话的攻击。值为表示直到关闭浏览器。例如意味着在每个请求中有的概率启动进程。 对于session的了解,之前一直没有仔细研究过,最近遇到了一些问题,需要解决session配置问题,就顺便查看了些资料。一下大多是网上的资料,自己只是整理了下,如果有错误希望...

    jsdt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<