不言不语

您现在的位置是: 首页 >  PHP

PHP

PHP session超时问题

2022-06-02PHP
session通常是根据php.ini中的 session.gc_maxlifetimie 的来控制超时时间,gc回收机制是有概率的,也就是说超时过期后不一定会清掉session。

    gc回收概率是通过php.ini中的session.gc_probability和sesssion.gc_divisor决定的。


回收几率 = probability / divisor


        session.gc_probability默认值为1; session.gc_divisor默认值为1000;也就是说session默认是1/1000分之一的概率,每1000次才会触发一次回收机制,当访问量小,比如只有一个用户在线时,该用户session超时了也不一定会被清掉,这就不能满足我们程序的严谨性。

 

        解决方案一

        修改session.gc_probability的值为1000,这样概率达到100%,每次操作都会触发回收机制,保证无漏网之鱼。

 

        解决方案二

        为了程序的移植方便,抛弃配置文件自动回收; 通过代码自己验证session时间,可能更为灵活。

 

        1.用户登陆后在当前session里存入当前时间


// login.php
$_SESSION['user']['onlinetime'] = time();


        2.在程序的基类中靠前位置加入判断


// baseClass.php
$nowtime = time();
$outtime = 1800;	// 过期时间为30分钟
if($nowtime - $_SESSION['user']['onlinetime'] > $outtime){
    session_destroy();
}else{
    $_SESSION['user']['onlinetime'] = $nowtime;
}

// ... 后续你肯定有对session的判断,session为空跳登陆页面咯


        效率问题

        第二种方案效率略高,而且在相同环境下若存在多个站,不影响别的站。

 

文章评论