去发现生活中的美好,记录生活中的点点滴滴

深入理解session机制

php admin 99℃

最近遇到一个session经常失效的问题,网上林林总总,我来总结和归纳下。
首先,用户请求后,服务端会创建创建session,保存在服务端(默认以文件形式保存,下文会提到),服务端给客户端返回session_id,然后session_id默认是通过cookie保存在客户端,如果客户端cookie禁用,则会通过url传递session_id。
通过cookie保存在客户端的session_id,这个cookie的过期时间是多久呢?这个取决于php.ini中的

session.cookie_lifetime = 0;

原文解释是:

Lifetime in seconds of cookie or, if 0, until browser is restarted。

如果把该参数设置成0,则cookie的时间永不失效,只到浏览器重启,这里我们可以知道,session的失效是重启浏览器或者清除cookie缓存后失效,也就是通常说的session在浏览器关闭后失效。
session失效还有一个重要的原因,那就是session的垃圾回收机制, session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在服务器的文件中(php.ini中session.save_handler = files),PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,但是有的系统是 session.gc_probability =0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。

php.ini默认设置
session.gc_probability =1
session.gc_divisor =1000
session.gc_maxlifetime =1440//过期时间 默认24分钟
 //概率是 session.gc_probability/session.gc_divisor 结果 1/1000,就是每次请求交互,有概率(1/1000)回收已经过期的session
//默认情况下,每一次php请求,就会有1/1000的概率发生回收,请求数越大,session.gc_diviso就需要设置更大

gc_maxlifetime 这个时间,是指session创建后,在24分钟内,客户端与服务端没有交互,就会失效,这也是session过期时间,在这个时间内,只要发生了交互,session的过期时间就会重新置为24分钟。
如果想要设置session过期时间,就要设置session.cookie_lifetime ,同时设置session.gc_maxlifetime,即可达到过期时间目的。

转载请注明:永盟博客 » 深入理解session机制

喜欢 (1)