如何设置一个严格30分钟过期的Session 【转自(风雪之隅)】

第一种回答:
最常见的一个回答:设置Session的过期时间,也就是session.gc.maxlifetime。这种回答是不正确的。原因如下:
1、首先,这个php是用一定的概率来运行session的gc的,也就是session.gc_probability和session.gc_divisor,这个默认值分别是1和100.也就是有1%的机会,php会在一个Session启动时,运行Session gc,不能保证到30分钟的时候一定会过期。

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

3、PHP默认的(Linux为例)是使用/tmp作为Session的默认存储目录,并且手册也有如下描述:
##
Note:如果不同的脚本具有不同的Session.gc_maxlifetime数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与session.save_path一起使用本命令,
##

也就是说,如果有两个应用都没有指定自己对立的save_path,一个设置了过期时间2 minutes(假设为A),一个设置为30minutes(假设为B)。那么每次当A的Session gc运行的时候,就会同时删除属于应用B的Session files。、、

所以,修改 session.gc_maxlifetime的方法不是完全严格正确的。

第二种回答:

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

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

第三种回答:
使用Memcache 、redis等。ok,这种答案是一种正确答案。不过,很显然出题者会接着问,如果只是有php呢?

第四种回答:

如何面试官的答案是:
1、设置Cookie过期时间30分钟,并设置Session的lifetime也为30 minutes;
2、自己为每一个session 值增加Time stamp;
3、每次之前,判断时间戳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值