PHP 中 Session 过期时间

发布于 2021-07-20 12:49:21 字数 1376 浏览 1471 评论 0

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 分钟就过期的优惠劵?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文