1

首先说一点新手认识中常见的误区:关闭浏览器session就过期了。这种说话是完全错误的,

session是否过期与客户端如何操作没什么必然关系,他只与服务器如何设置有关。

以下观点以以PHP语言举例,使用的是chrome浏览器[48.0.2564.116 (正式版本) m (32 位)](△注意这点,因为Firefox浏览器关闭后PHPSESSID会强行缓存,测试会导致不准)
2016年10月21日新增:
edge关闭后PHPSESSID悔刷新
但chrome与firfox都不会了。
猜测后两个浏览器不会是为了用户体验考虑。

每个用户访问网站,服务器会自动赋予用户一个session_id值,此时服务器与客户端(此处为浏览器)同时拥有着一份相同值的session_id值。

往后的所有包含SESSION数据增加,修改,删除,过期一切都是以session_id值,为基础,session_id值,就是像一把钥匙,沟通客户端与服务器端之间关于SESSION的一切操作。

那”关闭浏览器session就过期了”这种网上普遍流传的观点是如何出现的呢?

首先说明的是,如果服务器代码不进行特殊操作,展示出来的效果确实是”关闭浏览器session就过期了”,譬如有些网站关闭浏览器再打开就要重新登录,但是这不代表session过期了,session_id值依旧存在于服务端,session_id所指向的值是依旧存在的,以下代码可以很好的证明这一点,我关闭了浏览器甚至切换了浏览器,b.php永远都会打印出那个数据。

a.php:
040416_1334_Session1.png

040416_1334_Session2.png
b.php:
040416_1334_Session3.png

040416_1334_Session4.png

只要在session_start()前给session_id赋上一个初始值,那么当前会话就会以那个session_id值作为钥匙,去像服务器要数据。

所以在此处,b.php的session_id永远是”5op1k5moghb1hprgkifgh7nv71“,那么只要服务器的session_id值不过期,这段数据永远可以获得得到。

一次session_start就是一次新的会话,如果没有经过特意赋值,那么将会产生一个新的session_id,新的session_id和原来的”5op1k5moghb1hprgkifgh7nv71“对不上,客户端自然获取不到对应的session数据啦,那么就会出现”关闭浏览器session就消失这个误区”。

走出误区,我们来讨论一下session真正的过期策略吧。前面说了,session数据是否过期只与服务器有关,此处在php.ini修改session的过期策略配置:
040416_1334_Session5.png

三条红线分别影响着session的过期策略

Session.gc_probability = 1 //session删除几率的分子

Session.gc_divisor=1000 //session删除几率的分母

Session.gc_maxlifetime=1440 //24分钟删除一次一次

终上所述:默认的session过期机制为 24分钟删除一次,每个session_id会话被删除的几率为1/1000。

我们可以手动将三行配置都改成1,进行测试,那么我们会发现即使不关闭浏览器session值也是会过期的。(session值默认要刷新一遍才过期,所以即便都设置成1也要手动刷新一遍,这和session本身的机制有关)


大菌说事
4.9k 声望683 粉丝