session 入库2 垃圾回收机制

接上一篇 session 入库管理功能。
php 怎么知道一条记录是垃圾记录? php 并不知道。
 
如果浏览器不发出请求,服务器根本不知道浏览器是否存在。 服务器不能依赖浏览器完成垃圾回收。
 
php 的判断:如果一条记录(一个文件)多久没有使用,那么该数据就是垃圾了。
 
// 默认过期时间
php.ini  :   session.gc_maxlifetime = 1440 
1440 秒, 24 分钟。
 
 
session_start() 执行时,有千分之一的概率执行 gc(), 这个概率可以设置。
php.ini :  
session.gc_probability = 1   //这是分子,修改这个值能改变执行几率。
session.gc_divisor = 1000   //这是分母,修改这个的值,就能改变执行几率
 
执行几率 = session.gc_probability / session.gc_divisor ;
 
用 php 代码表示千分之一:
 
if(mt_rand(1, 1000) == 1){
    gc();
}
 
注意: 
1. 是概率,不是一定执行。
2. 执行 gc() 后才回去判断哪条几率过期,php (不是服务器)并不会一直监视记录是否过期。
 
 
 
改写上一篇中的垃圾回收方法: 
 
function sess_gc($ttl){
  echo __FUNCTION__;
  $expire = time() - $ttl;
  $sql = "delete from `session` where times < $expire";
  return mysql_query($sql);
}
 
 
注意: 
和 session_destroy() 不同,session_destroy() 删除的是自己的 session ,而 gc() 删除的是所有的 session, 除了自己的。为什么除了自己?把 gc 的执行概率增大到 1, 再来看,会发现执行过程: open() -> read() -> gc() -> write() -> close()
 
删除之前,已经读取出来放到 $_SESSION 中了,删除后,又写进去了,所以,删除不了自己的。自己的 session 都是在别人执行垃圾回收时删除的。
posted @ 2016-02-11 17:49  susancain  阅读(141)  评论(0编辑  收藏  举报