zoukankan      html  css  js  c++  java
  • 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 都是在别人执行垃圾回收时删除的。
  • 相关阅读:
    P2730 魔板 Magic Squares
    P2124 奶牛美容
    4. Median of Two Sorted Arrays(Array; Divide-and-Conquer)
    3.Longest Substring Without Repeating Characters(string; HashTable)
    2.Add Two Numbers (List)
    1.Two Sum (Array; HashTable)
    C++中的浅拷贝、深拷贝、智能指针
    C++ 静态数据成员和静态成员函数
    C & C++ 宏与const
    C++指针与引用
  • 原文地址:https://www.cnblogs.com/susancain/p/5186563.html
Copyright © 2011-2022 走看看