php基于session实现数据库交互的类实例

5年以前  |  阅读数:853 次  |  编程语言:PHP 

本文实例讲述了php基于session实现数据库交互的类。分享给大家供大家参考。具体如下:


    <?php
    /**
     * session 数据库存储类
     */
    class Session {
     private static $session_id   = 0;
     private static $session_data  = array();
     private static $is_update   = FALSE;
     private static $is_del    = FALSE;
     private static $is_gc    = FALSE;
     private static $dbo    = NULL;  //数据库连接句柄
     private static $gc_max_time  = 1440;
     private static $table   = 'sessions';
     private static $pre_key   = 'weige';//session 密钥
     //捆绑使用哈
     private static $gc_rate_de  = 100;//代表分母
     private static $gc_rate_co  = 20;//代表分子
     private static $path   = '/';//保存路径
     private static $domain   = null; //域
     private static $secure   = false;//默认
     private static $httponly  = false;//默认
     /**
      * 获取数据库句柄 私有
      */
     private static function open() 
     {
      if (!self::$dbo) 
      {
       self::$dbo = Db::factory();
      }
      return TRUE;
     }
     /**
      * 设置
      * */
     public static function set($key, $val=NULL) 
     {
      self::open();
      $data = self::read();
      if ($data === FALSE)
      {
       $data = array();
      }
      if (!$val && is_array($key))
      {
       $data = $key;
      } 
      else if ($val && is_string($key))
      {
       $data[$key] = $val;
      }
      self::write($data);
      self::close();
     }
     /**
      *获取值 
      * 
      */
     public static function get($key=NULL) {
      self::open();
      self::$session_data = self::read();
      $ret = '';
      if (!$key) {
       $ret = self::$session_data;
      } else if(is_array(self::$session_data) && isset(self::$session_data[$key])) {
       $ret = self::$session_data[$key];
      }
      self::update(); 
      self::close();
      return $ret;
     }
     /**
      * 删除或者重置
      * */
     public static function del($key)
     {
      if (!self::$is_del) 
      {
       self::open();
       $val = self::read();
       if (isset($val[$key])) 
       {
        unset($val[$key]);
       }
       $session_id  = self::$session_id;
       $session_data  = serialize($val);
       $session_expire = TIME + self::get_gc_maxtime();
       self::$dbo->query("update ".self::$table." set value='$session_data', expiry='$session_expire' where session_id='$session_id'");
       self::close();
      }
      self::$is_del = TRUE;
     }
     /**
      * 销毁
      * 
      * */
     public static function destroy() 
     {
      $session_id   = self::get_session_id();
      $_COOKIE['WBSID'] = '';
      self::open();
      self::$dbo->query("delete from ".self::$table." where session_id='$session_id'");
      self::close();
     }
     /**
      * 读取 私有
      * */
     private static function read()
     {
      $session_id = self::$session_id;
      if (!$session_id) {
       $session_id = self::get_session_id();
      }
      if (!$session_id) return array();
      $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
      $client_ip = Fun::getIp();
      $session_expire = TIME - self::get_gc_maxtime();
      $rs = self::$dbo->fetchRow("select session_id, value, agent, ip from ".self::$table."
       where session_id='$session_id' and expiry>'$session_expire'");
      if (!$rs || $rs['agent'] != $user_agent || $rs['ip'] != $client_ip) 
      {
       return FALSE;
      }
      self::$session_id = $rs['session_id'];
      return unserialize($rs['value']);
     }
     /**
      * session 写入 私有
      * */
     private static function write(array $session_data) 
     {
      $session_id = self::$session_id;
      if (!$session_id)
      {
       $session_id = self::get_session_id();
      }
      $session_expire = TIME + self::get_gc_maxtime();
      $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
      $client_ip  = Fun::getIp();
      $session_data = serialize($session_data);
      if (self::$session_id && self::$session_id === $session_id) 
      {
       self::$dbo->query("update ".self::$table." set value='$session_data', expiry='$session_expire', agent='$user_agent', ip='$client_ip' where session_id='$session_id'");
      } 
      else 
      {
       self::$session_id = $session_id = self::create_session_id();
       self::$dbo->query("insert into ".self::$table."(session_id, value, expiry, agent, ip) 
        values('$session_id', '$session_data', '$session_expire', '$user_agent', '$client_ip')");
      }
      return true;
     }
     /**
      * session 更新 私有
      * */
     private static function update() 
     {
      if (!self::$is_update) 
      {
       $session_id = self::$session_id;
       $session_expire = TIME + self::get_gc_maxtime();
       self::$dbo->query("update ".self::$table." set expiry='$session_expire' where session_id='$session_id'");
      }
      self::$is_update = TRUE;
     }
     private static function close() 
     {
      if (!self::$is_gc && mt_rand(1, self::$gc_rate_de)%self::$gc_rate_co == 0) 
      {
       self::gc();
      }
      self::$is_gc = TRUE;
     }
     /**
      * 过期session 清除 随机触发
      * */
     private static function gc() 
     {
      $session_expire = TIME - self::get_gc_maxtime();
       self::$dbo->query("delete from ".self::$table." where expiry<'$session_expire'");
     }
     private static function get_session_id() 
     {
      if (isset($_COOKIE['WBSID']) && strlen($_COOKIE['WBSID'])==32) 
      {
       $sid = $_COOKIE['WBSID'];
       setcookie('WBSID', $sid, TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
       return $sid;
      }
      return null;
     }
     private static function create_session_id() 
     {
      $sid = self::get_session_id();
      if (!$sid) 
      {
       $sid = Fun::getIp() . TIME . microtime(TRUE) . mt_rand(mt_rand(0, 100), mt_rand(100000, 90000000));
       $sid = md5(self::$pre_key . $sid);
       setcookie('WBSID', substr($sid, 0, 32), TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
      }
      return $sid;
     }
     public static function get_gc_maxtime()
     {
      return self::$gc_max_time;
     }
    }

希望本文所述对大家的php程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例