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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
用PHP实现小型站点广告管理(修正版)
Oct 09 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
Jul 31 PHP
php异常处理使用示例
Feb 25 PHP
php生成xml时添加CDATA标签的方法
Oct 17 PHP
php使用Cookie实现和用户会话的方法
Jan 21 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
PHP简单验证码功能机制实例详解
Mar 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获取网卡地址的代码
2008/04/09 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
简单的js表单验证函数
2013/10/28 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
js实现上传图片及时预览
2016/05/07 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python中super函数的用法
2017/11/17 Python
Python3多线程基础知识点
2019/02/19 Python
Django3中的自定义用户模型实例详解
2020/08/23 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
医院党员公开承诺书
2014/08/30 职场文书
2014年工人工作总结
2014/11/25 职场文书
表扬稿范文
2015/01/17 职场文书
医生个人年度总结
2015/02/28 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
MySQL的索引你了解吗
2022/03/13 MySQL
灵能百分百第三季什么时候来?
2022/03/15 日漫