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安全编程之加密功能
Oct 09 PHP
php 中英文语言转换类代码
Aug 11 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
Jun 24 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
分享php分页的功能模块
Jun 16 PHP
PHP 数组基本操作小结(推荐)
Jun 13 PHP
Yii中的relations数据关联查询及统计功能用法详解
Jul 14 PHP
iOS10推送通知开发教程
Sep 19 PHP
php接口隔离原则实例分析
Nov 11 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
html读出文本文件内容
2007/01/22 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
理解 Node.js 事件驱动机制的原理
2017/08/16 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Python实现提取文章摘要的方法
2015/04/21 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
软件测试工程师面试问题精选
2016/10/28 面试题
创业计划书的内容步骤和要领
2014/01/04 职场文书
开学典礼主持词
2014/03/19 职场文书
委托书范本
2014/04/02 职场文书
爱心捐款倡议书
2014/04/14 职场文书
幼儿评语大全
2014/04/30 职场文书
学习方法演讲稿
2014/05/10 职场文书
2014年督导工作总结
2014/11/19 职场文书
运动会广播稿50字
2015/08/19 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
一文简单了解MySQL前缀索引
2022/04/03 MySQL
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android