您的位置:首页 > 其它

关于修改session的生存时间以及回收机制

2018-03-28 21:49 633 查看

一、修改session的生存时间

1)通过php.ini修改

//这里代表我们修改了session存在的最大时间
session.gc_maxlifetime = 86400


2)通过代码实现

$lifeTime = 24 * 3600; // 保存一天
session_set_cookie_params($lifeTime);
session_start();


二、关于session存在的解释

1)session机制

      当我们执行session_start()之后,就会生成一个sessionID,保存在$_COOKIE变量中(此时,该sessionID并没有保存到客户端,他仅仅存在于会话之中)。同时服务器端默认会在/tmp目录下建立一个session文件,文件名是用前缀“sess_”再加上当前的sessionID组合而成的,我暂且把他叫做sess文件吧。

2)cookie机制

      当使用cookie机制的时候,在sess文件中没有保存任何数据。而cookie中的数据,实际上是通过setcookie()的方法保存在客户端的。

并且,该方法只将指定的数据保存到了客户端,而sessionID并没有被保存到客户端。这个时候sessionID依然存在于会话之中。

当重新打开浏览器之后,我们发现当前的sessionID实际上已经不是之前的sessionID了,

但是cookie中的数据并不受影响,我们仍然可以通过$_COOKIE变量来获取cookie的值。

3)session文件的存储位置

在Linux下,这一路径通常为\tmp,在Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中。

三、session的回收机制GC(Garbage Collector)

1)GC的工作原理

      当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。

      GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。

2)控制GC的参数

session.gc_maxlifetime  //代表session的最大存活时间

session.gc_probability
session.gc_divisor


<
4000
p>      session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。

就比如我本地的php.ini中,

//此处代表每发生1000次php请求,就有可能执行一次GC回收
session.gc_probability  = 1;
session.gc_divisor  = 1000;


这里建议大型的门户网站,可以通过减小GC回收发生的概率来提升网站的性能。

四、可能遇到的问题

1)gc_maxlifetime无效的情况

答:GC在工作时,并不会区分不同站点的session。

具体参考链接:为什么gc_maxlifetime会失效

2)如何保证用过的session立刻删除

答:提升出发GC回收的几率。比如

session.gc_probability  = 1000;
session.gc_divisor  = 1000;
//这样触发的几率就是100%,缺陷就是很影响性能。


3)改变session文件的存储位置

<?php
session_save_path("D:/www/session/rrr");
session_start();

//echo"sssss1";
$_SESSION[ "temp"]   =   "tpp ";

?>


这里需要注意的是需要在启动session之前就改变其存储位置。不然会失效。

4)如果有一些session不想删除怎么办

<?php
if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60)
$_SESSION['last_access'] = time();
?>


解释:代码会每隔60秒,尝试修改一次session。这样该session文件的活跃时间就会一直在最大存活时间的范围内。从而达到一致存在的目的。

end

参考链接:
https://blog.csdn.net/gxrj11/article/details/51262848
https://www.cnblogs.com/hongfei/archive/2012/06/17/2552434.html
https://blog.csdn.net/xiaoniu__/article/details/72650311
http://www.jb51.net/article/49757.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: