彻底解决PHP Session不过期以及SessionId保持不变的问题

用过asp.net里面的session再用过php里面的session,你会觉得php 的session相比asp.net里面的session是如此的不爽。在用php的session,你可能会遇到session不失效,关掉浏览器session还存在,重新打开浏览器sessionid还和以前一样等问题。。。

下面我们就来看下php的session机制:

session 回收机制:

PHP采用Garbage Collection process对过期session进行回收,然而并不是每次session建立时,都能够唤起 ‘garbage collection’ process ,gc是按照一定概率启动的。这主要是出于对服务器性能方面的考虑,每个session都触发gc,浏览量大的话,服务器吃不消,然而按照一定概率开启gc,当流览量大的时候,session过期机制能够正常运行,而且服务器效率得到节省。细节应该都是多年的经验积累得出的。

三个与PHP session过期相关的参数(php.ini中):

session.gc_probability = 1

session.gc_divisor = 1000

session.gc_maxlifetime = 1440

gc启动概率 = gc_probability / gc_divisor = 0.1%

session过期时间 gc_maxlifetime 单位:秒

当web服务正式提供时,session过期概率就需要根据web服务的浏览量和服务器的性能来综合考虑session过期概率。为每个session都开启gc,显然是不明智的,感觉有点“碰运气”的感觉,要是访问量小命中几率就小。我在本机测试过程中,几乎都没有被命中过,sessionid几天都不变,哪怕机器重启。测试过程中,这个过期概率值要设置大一点命中几率才高点。

通过修改php配置文件的过期概率值,可以“碰运气”式的设置session过期,那有没有更好的办法呢?

下面写的这个session类可以彻底解决session不过期以及sessionid不变的问题。

<?php
 /**
  * 扩展Session类(简单封装)
  *
  * @author slimboy
  *
  */
class Session { 

     /**
      * 初始化
      */
    static function _init(){
        ini_set(‘session.auto_start‘, 0);
        //Session::start();
     } 

     /**
      * 启动Session
      */
    static function start() {
        session_start();
    } 

     /**
      * 设置Session
      *
      * @param $name Session名称
      * @param $value 值
      * @param $time 超时时间(秒)
      */
    public static function set($name,$value,$time){
        if(empty($time)){
            $time = 1800; //默认值
         }
        $_SESSION[$name] = $value;
        $_SESSION[$name.‘_Expires‘] = time() + $time;
    } 

     /**
      * 获取Session值
      *
      * @param $name Session名称
      */
    public static function get($name){
        //检查Session是否已过期
         if(isset($_SESSION[$name.‘_Expires‘]) && $_SESSION[$name.‘_E
 xpires‘]>time()){
            return $_SESSION[$name];
        }else{
            Session::clear($name);
            return null;
        }
    } 

     /**
      * 设置Session Domain
      *
      * @param $sessionDomain 域
      * @return string
      */
    static function setDomain($sessionDomain = null) {
        $return = ini_get(‘session.cookie_domain‘);
        if(!empty($sessionDomain)) {
            ini_set(‘session.cookie_domain‘, $sessionDomain);//跨
 域访问Session
         }
        return $return;
    } 

     /**
      * 清除某一Session值
      *
      * @param $name Session名称
      */
    static function clear($name){
        unset($_SESSION[$name]);
        unset($_SESSION[$name.‘_Expires‘]);
    } 

     /**
      * 重置销毁Session
      */
    static function destroy(){
        unset($_SESSION);
        session_destroy();
    } 

     /**
      * 获取或设置Session id
      */
    static function sessionid($id=null){
        return session_id($id);
    } 

}
?>

简单调用:

<?php
    //设置session
    Session::set(‘UserId‘, $userid, 3600);
    //读取session
    $userId = Session::get(‘UserId‘);
?>
时间: 2024-10-14 19:47:31

彻底解决PHP Session不过期以及SessionId保持不变的问题的相关文章

PHP中的session永不过期的解决思路及实现方法分享

打开php.ini设置文件,修改三行如下: 1.session.use_cookies  把这个的值设置为1,利用cookie来传递sessionid  2.session.cookie_lifetime  这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以PHP的 session不能永久使用! 那么我们把它设置为一个我们认为很大的数字吧,999999999怎么样,可以的!就这样.  3.session.gc_maxl

session设置过期的方法(转载)

这篇文章主要介绍了php中实现精确设置session过期时间的方法,需要的朋友可以参考下 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间. 对此,可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟) 这里你可以随便设置一下过期时间.但是有人说设置以后,好象不起作用! 其实不是不起作用,而是因为系统默认: ? 1 2 session.gc

利用spring session解决共享Session问题

1.共享Session问题 HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的.而如果我们把web服务器搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被分发到两个不同的web站点中去.那么问题就来了,如何保证不同的web站点能够共享同一份session数据呢? 最简单的想法就是把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中.那么问题又来了,如何

如何使Session永不过期

转载:http://blog.csdn.net/wygyhm/article/details/2819128 先说明情况:公司做监控系统,B/S结构,主要用在局域网内部!监控系统开机可能要开好长时间,管理员的ID 和权限等是写在Session里的——我想不用Cookies的原因可能是Cookies不是很安全,还有就是局域网内,只是几台机子访问服务器, Session没有几个,所以即使总保持着Session也不会太占用资源,最起码服务器能承受的起. 保持Session的方法:有人说设session

ThinkPHP中:检查Session是否过期

1.创建Session 1 public function index(){ 2 $sess_time=time(); 3 session('name','andy'); 4 session('time_stamp',$sess_time); 5 } 2.检查Session是否过期 1 /** 2 * 检查Session是否过期(30分钟) 3 */ 4 public function checkSessTime(){ 5 if (!$_SESSION) { 6 header('content-

关于session的过期时间的方法

session的的过期时间的设置,通用的三种方法: 1.  直接在后台代码中设计,使用session.setMaxInactiveInterval(60*60); 注意这个时间的单位是秒,60*60就是一小时. 如果将时间设置为负数,则表示用不过期. 2.在项目的web.xml文件中添加配置过期时间的代码即可. <session-config> <session-timeout>400</session-timeout> </session-config>

Spring Session解决分布式Session问题的实现原理

使用Spring Session和Redis解决分布式Session跨域共享问题 上一篇介绍了如何使用spring Session和Redis解决分布式Session跨域共享问题,介绍了一个简单的案例,下边就学习一下Spring Session的实现原理. 注:以下步骤是基于XML的方式实现 Spring Session的代码讲解! 先从web.xml文件说起 我们知道Tomcat再启动的时候首先会去加载web.xml 文件,Tomcat启动的时候web.xml被加载的顺序:context-pa

thinkphp3.2设置session的过期时间

thinkPHP3.2中session的过期时间配置是不能使用的,我们需要修改一下它的配置文件thinkPHP>common>functions.php,找到这一行: if(isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']); 改成: if(isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']);ini_

Thinkphp框架下设置session的过期时间

打开项目中的配置文件,添加session的过期配置,如下: 'SESSION_OPTIONS' => array( 'name' => 'BJYSESSION', //设置session名 'expire' => 3600, //SESSION过期时间,单位秒 'use_trans_sid' => 1, //跨页传递 'use_only_cookies' => 0, //是否只开启基于cookies的session的会话方式 ),