最近在自学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~