SESSION会话控制超时时间的控制

PHPABC PHP开发 2,019 次浏览 , , 没有评论

一直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的一些设置,当然第一种也简洁。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Go