一直session的机制我其实不是很清楚的,所以今天抽点时间把session的一些特性好好整理一下:
众所周知要启用session必须在php文件的最开始使用session_start()来开启session才行,session的过期回收并不是指定时间的过期,而是有一定概率的回收的,因为session是保存在服务器文件中的,session的回收涉及到文件的删除,概率在php.ini里可以配置。
session.gc_probability =1 session.gc_divisor =1000 session.gc_maxlifetime =1440//过期时间 默认24分钟 //概率是 session.gc_probability/session.gc_divisor 结果 1/1000, //不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。 session.save_path =//好像不同的系统默认不一样,有一种设置是 "N;/path" //这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本 session.gc_probability =1 session.gc_divisor =1000 session.gc_maxlifetime =1440//过期时间 默认24分钟 //概率是 session.gc_probability/session.gc_divisor 结果 1/1000, //不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。 session.save_path =//好像不同的系统默认不一样,有一种设置是 "N;/path" //这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本 |
然而这并没有能够解决session的过期问题,因为除非设置session.gc_probability为1000才能100%回收,这不是我们想要的。
session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,这个值可以从php.ini找到session.name = PHPSESSID //默认值PHPSESSID
以上是session的基本原理,可以认为session和cookie是密不可分的,那么只要同时设置了seesion和cookie的过期时间就可以了。
<?php ini_set('session.gc_maxlifetime',600); ini_set('session.cookie_lifetime',600); //在文件中设置这两条数据即可让session600秒过期 ?> |
<?php ini_set('session.gc_maxlifetime',600); ini_set('session.cookie_lifetime',600); //在文件中设置这两条数据即可让session600秒过期 ?> |
第二种方式是把时间戳保存在session里,然后每次去比对:
if(isset($_SESSION['expiretime'])) { if($_SESSION['expiretime'] < time()) { unset($_SESSION['expiretime']); header('Location: logout.php?TIMEOUT'); // 登出 exit(0); } else { $_SESSION['expiretime'] = time() + 3600; // 刷新时间戳 } } if(isset($_SESSION['expiretime'])) { if($_SESSION['expiretime'] < time()) { unset($_SESSION['expiretime']); header('Location: logout.php?TIMEOUT'); // 登出 exit(0); } else { $_SESSION['expiretime'] = time() + 3600; // 刷新时间戳 } } |
第一种和第二种方式都可以解决问题,但是我还是比较偏爱第二种,更加灵活一点,而且不会去修改session的一些设置,当然第一种也简洁。