• 关于 Session Time Out 的时间控制总结


    from:http://weblog.kreny.com/2007/06/_php_session_time_out.html
    关于 Session Time Out 的时间控制,这里稍微总结一下,做个纪录。

    php.ini 的关于 Session 的设置
    ① 是否要 cache ? ==> NO!
    在 http 的 header 里面输出一些关于 session 的 cache(??对具体定义不是很清除) ,虽然这个和 Session 的 time out 没有什么直接的联系,但从历来的经验来讲,会出现一些很奇怪的现象,所以这里统一将 cache 关闭,使得 header 里面不出现 session 的信息。

    ; Set to to determine HTTP caching aspects
    ; or leave this empty to avoid sending anti-caching headers.
    session.cache_limiter = nocache

    ; Document expires after n minutes.
    session.cache_expire = 180

    ② 关于 garbage

    ; Define the probability that the 'garbage collection' process is started
    ; on every session initialization.
    ; The probability is calculated by using gc_probability/gc_divisor,
    ; e.g. 1/100 means there is a 1% chance that the GC process starts
    ; on each request.

    session.gc_probability = 1
    session.gc_divisor = 100

    ; After this number of seconds, stored data will be seen as 'garbage' and
    ; cleaned up by the garbage collection process.
    session.gc_maxlifetime = 1440


    这个设置是指:在 1440 秒后, Session 会被认作是 garbage (垃圾),而针对这些 garbage ,在每次连接(request),有 1/100 的几率(下文称为“清除几率”)来清除这些 garbage--当然,可以认为在 1440 秒后,平均通过进行 100 次的连接就会将 garbage session清除。
    如果将以上的分子和分母都调整到 1, 那所有的 garbage session 将会在期限(session.gc_maxlifetime)过后的第一次 request 的时候被清除。但是这会大大加大对服务器的负荷,不建议使用。


    ③最后设置 session.cookie_lifetime

    ; Whether to use cookies.
    session.use_cookies = 1

    ; Lifetime in seconds of cookie or, if 0, until browser is restarted.
    ; session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。
    ; 值为 0 表示“直到关闭浏览器”。默认为 0。
    session.cookie_lifetime = 0


    如果使用 cookie 在客户端保存 session 信息,这里可以设置 cookie 的有效时间。自己的理解是,在客户端的 cookie 里面保存有 Session ID,用来比较其有效期限。
    现在做的项目使用 cookie 来保存用户信息,每当 session.cookie_lifetime 设置为 0 的时候,理所当然 IE 被关闭后每次都要重新登陆。但是当将此设置为一定的值后,在指定的秒数内重新打开该页面,仍旧保留以前的 cookie 数据并且自动登陆。


    留意点:
    session.cookie_lifetime 设定为一个值 (例如 1000 秒)后,相应的 session.gc_maxlifetime 也需要设置为 1000 ,才能方便清除?
    因为测试过几次,将 session.cookie_lifetime 设置为较小的数值(例如 100秒)的时候,即使将“清除几率”变为 100% , 也不能在这个较小数值的时间内将 session 清除。因此怀疑是 session.gc_maxlifetime 设置了较大的一个值,使得系统需要更多的时间将 session 认定为 garbage, 即使这个 session 实质上已经过了它的 lifetime。 
    几经测试,在统一了 session.cookie_lifetime 和 session.gc_maxlifetime 后, session 的定期清除效果比较好。

    那么如何有效的限制 Session 的 Time out 呢?以下是两个众所周知的方案,仅作纪录。

    将 Timestamp 放入 $_SESSION 中,每次 request 的时候对其值和现在值 now() 进行比较。如果时间间隔没有超出 Time Out 的期限,那么就将现在的时间 now() 赋值给 $_SESSION 中的纪录 timestamp 的部分。
    将 timestamp 放入 数据库中,每次 request 的时候对其值和现在值 now() 进行比较。如果时间间隔没有超出 Time Out 的期限,那么就将该用户的 session 纪录进行更新。

    ======================
    你在这个设定中设定了分子项.但是没有设定分母项所以,请除过期的session的机会还是只有预设的1%的机会.
    所以你必须要设定你的分母为1,才会是 1/1=100%

    <?php
    ob_start();
    ini_set('session.save_path',"C:\\php\\tmp2"); //设定在存目录
    ini_set('session.name', 'pissession'); // session值使用名称
    ini_set('session.gc_probability', 1); // 回收处理分子项
    ini_set('session.gc_divisor', 1); // 回收处理分母项
    ini_set('session.gc_maxlifetime', 15); // 清除以目前时间差中失效的过期sessionini_set('session.cookie_lifetime', 0); // Cookie的SID存在时间
    echo $_SESSION['pis'];
    if(isset($_SESSION['pis'])){
    echo 'gc_maxlifetime = ' . ini_get('session.gc_maxlifetime') . "";
    echo 'logined:'.$_SESSION['pis'];
    }else{
    echo 'timeout';
    }
    ?>

    以这样的设定,每一个SESSION在下次开启SESSION_START时100%会去清除.
  • 相关阅读:
    WebSocket
    Spring Web MVC
    对象关系映射(ORM)数据访问
    使用JDBC进行数据访问
    【Mysql】【基础综合题解】大一下学期数据库综合训练题解
    【Mysql】【解决问题】[Err] 1055
    【JavaSE】【IO流】复制单级或多级文件夹
    C#使用FFmpeg的总结
    C#一个IM系统简单总结
    重新开启博客
  • 原文地址:https://www.cnblogs.com/dkblog/p/1980760.html
Copyright © 2020-2023  润新知