您当前的位置:首页 > 计算机 > 编程开发 > PHP

PHP 中 Session 过期时间

时间:12-14来源:作者:点击数:

1、第一种回答

那么,最常见的一种回答是:设置 Session 的过期时间,也就是 session.gc_maxlifetime,这种回答是不正确的,原因如下:

首先,这个 PHP 是用一定的概率来运行 Session 的 gc 的,也就是 session.gc_probability 和 session.gc_divisor,这个默认的值分别是 1 和 100,也就是有 1% 的机会,PHP 会在一个 Session 启动时,运行 Session gc。不能保证到 30 分钟的时候一定会过期。

那设置一个大概率的清理机会呢?还是不妥,为什么?因为 PHP 使用 stat Session 文件的修改时间来判断是否过期,如果增大这个概率一来会降低性能,二来,PHP 使用 一个 文件来保存和一个会话相关的 Session 变量,假设我 5 分钟前设置了一个 a=1 的 Session 变量,5 分钟后又设置了一个 b=2 的 Seesion 变量,那么这个 Session 文件的修改时间为添加 b 时刻的时间,那么 a 就不能在30分钟的时候,被清理了。另外还有下面第三个原因。

PHP 默认的(Linux 为例) 是使用 /tmp 作为 Session 的默认存储目录,如果有俩个应用都没有指定自己独立的 save_path,一个设置了过期时间为 2 分钟(假设为 A), 一个设置为 30 分钟(假设为 B),那么每次当 A 的 Session gc 运行的时候,就会同时删除属于应用 B 的 Session files。

2、第二种答案

还有一种常见的答案是:设置 Session ID 的载体,Cookie 的过期时间,也就是 session.cookie_lifetime。这种回答也是不正确的,原因如下:

这个过期只是 Cookie 过期,换个说法这点就考察 Cookie 和 Session 的区别,Session 过期是服务器过期,而 Cookie 过期是客户端(浏览器)来保证的,即使你设置了 Cookie 过期,这个只能保证标准浏览器到期的时候,不会发送这个 Cookie(包含着 Session ID)而如果通过构造请求,还是可以使用这个 Session ID 的值。

3、第三种答案

使用 memcache、redis 等,这种答案是一种正确答案。不过,很显然出题者肯定还会接着问你,如果只是使用 PHP 呢?

4、第四种答案

当然,面试不是为了难道你,而是为了考察思考的周密性。在这个过程中我会提示出这些陷阱,所以一般来说,符合题意的做法是:

  1. 设置 Cookie 过期时间 30 分钟,并设置 Session 的 lifetime 也为 30 分钟
  2. 自己为每一个 Session 值增加 Time stamp。
  3. 每次访问之前,判断时间戳。

最后,有同学问,为什么要设置 30 分钟的过期时间,这个,首先这是为了面试,第二,实际使用场景的话,比如 30 分钟就过期的优惠劵?

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐