PHP 中 Session 过期时间
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、第四种答案
当然,面试不是为了难道你,而是为了考察思考的周密性。在这个过程中我会提示出这些陷阱,所以一般来说,符合题意的做法是:
- 设置 Cookie 过期时间 30 分钟,并设置 Session 的 lifetime 也为 30 分钟
- 自己为每一个 Session 值增加 Time stamp。
- 每次访问之前,判断时间戳。
最后,有同学问,为什么要设置 30 分钟的过期时间,这个,首先这是为了面试,第二,实际使用场景的话,比如 30 分钟就过期的优惠劵?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论