最近在自学PHP,看到Cookie和SESSION的部分,对SESSION的生命周期有了一点的钻牛角尖的研究。

对于SESSION的生命周期,我们一般有两种方法来设定。一个是寄托在Cookie身上,在setcookie时顺便带上一个 lifetime ,另外一个就是在session_start之前用session_set_cookie_params来声明其声明周期,这两种方法有什么区别呢。

session.gc_maxlifetime这个参数是不是无效的= =,设置后感觉不太对劲。首先我们先来认识SESSION的终极生命周期,就是在php.ini文件里的session.gc_maxlifetime = 1440。这里默认是1440秒,也就是24分钟。超出这个时间服务器上的SESSION文件就会被删除(清空?),所以用户手里的SESSION就会失效,也就像是“超出最大登录时间,需要重新登录”,以下讨论都是在这个session.gc_maxlifetime之内进行的。

后来研究后的结论是这样的.

首先是单独使用的情况,单独使用setcookie带上 lifetime 的方式

setcookie(session_name(), session_id(), time() + 5, '/'); //设置SESSION过期时间为5秒

在用户每次刷新带有setcookie的页面后都会将倒计时重置。也就是说,如果一个用户不停地刷新setcookie的页面的话,他手中的SESSION会一直有效,直到不再setcookie。换个情况,如果用户用这个SESSION去访问别的不含setcookie的页面,那么过了相应的时间SESSION也就过期了。本质上就是不停地在执行setcookie操作,lifetime 参数一直被重新设置成time() + 5,某个页面不执行这个操作了,那么倒计时就正常计算并过期。

单独使用session_set_cookie_params和单独使用setcookie的区别就是,无论用户在执行session_set_cookie_params的页面刷新多少次,倒计时不变。设定好多少时间,到了时间一样失效。

然后是同时使用的情况。session_set_cookie_params必须要在session_start之前,所以同时使用只有一种情况,就是先用了session_set_cookie_params设定了时间后,再在setcookie中设定过期时间的话,那么SESSION的正确过期时间是哪一个呢?

答案是:此时的SESSION的过期时间以setcookie后的为准。也就是说setcookie后,之前的session_set_cookie_params的操作好比就是被覆盖了= =,所以过期时间随着用户刷新setcookie的页面还是会增加的。

如果有人发现有错的话,请马上联系我纠正,THX~