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基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
php smarty模版引擎中的缓存应用
Dec 11 PHP
让PHP显示Facebook的粉丝数量方法
Jan 08 PHP
ThinkPHP CURD方法之where方法详解
Jun 18 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
PHP session 会话处理函数
Jun 06 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
Apr 07 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定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
PHP attributes()函数讲解
2019/02/03 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
python创建和使用字典实例详解
2013/11/01 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
python如何查看网页代码
2020/06/07 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
师范大学毕业自我鉴定
2013/11/21 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
怎么写好自荐书
2014/03/02 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
无罪辩护词范文
2015/05/21 职场文书
转变工作作风心得体会
2016/01/23 职场文书