PHP中session有效期详解

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

cookie机制:
当使用cookie机制的时候,在sess文件中没有保存任何数据。而cookie中的数据,实际上是通过setcookie()的方法保存在客户端的。
并且,该方法只将指定的数据保存到了客户端,而sessionID并没有被保存到客户端。这个时候sessionID依然存在于会话之中。
当重新打开浏览器之后,我们发现当前的sessionID实际上已经不是之前的sessionID了,
但是cookie中的数据并不受影响,我们仍然可以通过$_COOKIE变量来获取cookie的值。

一般的session机制:
当使用session机制的时候,所有$_SESSION中的数据实际上是保存在了sess文件中,当我们在页面间跳转的时候,由于sessionID不变, php会通过当前的sessionID找到sess文件,然后取出其中的数据,因此我们就可以通过$_SESSION变量来获session的值。
等到重启浏览器之后,由于sessionID变化了,所以也就取不到$_SESSION中的值了。

上面为什么说是一般的session机制呢,因为我们可以用一个php的函数:session_set_cookie_params()来实现cookie的机制。详情如下:
CODE:
// 取出当前的sessionID的设置
$cookieParams = session_get_cookie_params();

// 修改当前的sessionID的设置
session_set_cookie_params(
    3600,// 设置sessionID在cookie中保存的时长
    $cookieParams['path'],
    $cookieParams['domain'],
    $cookieParams['secure']
    );
// 重新生成一个新的sessionID
session_regenerate_id(true);
// 执行session_start()
// 注意,此时的session_start跟平时不一样的地方是,这个时候启动session的同时,他会把当前的sessionID保存到客户端的cookie中
session_start();

通过以上方法,这样在就算重启了浏览器,只要客户端的cookie文件不过期,
php会自动(不需要人工获取)通过cookie文件获取到上次访问时的sessionID,因此依然可以获取到之前设置的$_SESSION数据。
有的同学看到这里可能就会问了。sess文件不是有存活期的吗,生存期过了会怎么样?
这个我还没测试,我目前估计当存活期过了之后,用这个方法就取不到session中的值了。
因为sess文件都不存在了嘛。不过我们可以通过控制sess文件的存活期(修改php.ini中的session.gc_maxlifetime选项,默认是1440秒),来延长$_SESSION的访问。

由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。
默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值