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 session常见问题集锦及解决办法总结
Mar 18 PHP
56.com视频采集接口程序(PHP)
Sep 22 PHP
php中$this-&amp;gt;含义分析
Nov 29 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
Jun 10 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP 的比较运算与逻辑运算详解
May 12 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
apache php mysql开发环境安装教程
Jul 28 PHP
Django中的cookie与session操作实例代码
Aug 17 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
小程序开发之模态框组件封装
2020/04/23 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
Python合并多个Excel数据的方法
2018/07/16 Python
django settings.py 配置文件及介绍
2019/07/15 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
《猴子种树》教学反思
2014/02/14 职场文书
文员岗位职责范本
2014/03/08 职场文书
绿色城市实施方案
2014/03/19 职场文书
电工技术比武方案
2014/05/11 职场文书
新农村建设典型材料
2014/05/31 职场文书
团代会开幕词
2015/01/28 职场文书
离婚被告代理词
2015/05/23 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
导游词之西安骊山
2019/12/20 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang