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


Posted in PHP onAugust 03, 2015

本文实例讲述了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 相关文章推荐
php 获取客户端的真实ip
Nov 30 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
php高级编程-函数-郑阿奇
Jul 04 PHP
PHP编码规范的深入探讨
Jun 06 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
PHP的几个常用加密函数
Feb 03 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
详细解读php的命名空间(二)
Feb 21 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 PHP
php与阿里云短信接口接入操作案例分析
May 27 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 #PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 #PHP
UTF-8正则表达式如何匹配汉字
Aug 03 #PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 #PHP
php中ob函数缓冲机制深入理解
Aug 03 #PHP
如何利用http协议发布博客园博文评论
Aug 03 #PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
Aug 01 #PHP
You might like
PHP的FTP学习(一)
2006/10/09 PHP
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
JS 动态加载脚本的4种方法
2009/05/05 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
python操作字典类型的常用方法(推荐)
2016/05/16 Python
Python画图学习入门教程
2016/07/01 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
python爬虫增加访问量的方法
2019/08/22 Python
Python中格式化字符串的四种实现
2020/05/26 Python
浅谈Python 参数与变量
2020/06/20 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
大学生党课思想汇报
2013/12/29 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书