一、修改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
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