命名格式:

Session + 驱动名称 + .class.php

所有的方法要有,但不一定要实现。

  1. <?php
  2. /**
  3. * @category Extend
  4. * @package Extend
  5. * @subpackage Driver.Session
  6. * @author liu21st <liu21st@gmail.com>
  7. */
  8. class SessionDb {
  9.  
  10. /**
  11. * Session有效时间
  12. */
  13. protected $lifeTime = '';
  14.  
  15. /**
  16. * session保存的数据库名
  17. */
  18. protected $sessionTable = '';
  19.  
  20. /**
  21. * 数据库句柄
  22. */
  23. protected $hander = array();
  24.  
  25. /**
  26. * 打开Session
  27. * @access public
  28. * @param string $savePath
  29. * @param mixed $sessName
  30. */
  31. public function open($savePath, $sessName) {
  32.  
  33. }
  34.  
  35. /**
  36. * 关闭Session
  37. * @access public
  38. */
  39. public function close() {
  40.  
  41. }
  42.  
  43. /**
  44. * 读取Session
  45. * @access public
  46. * @param string $sessID
  47. */
  48. public function read($sessID) {
  49.  
  50. }
  51.  
  52. /**
  53. * 写入Session
  54. * @access public
  55. * @param string $sessID
  56. * @param String $sessData
  57. */
  58. public function write($sessID,$sessData) {
  59.  
  60. }
  61.  
  62. /**
  63. * 删除Session
  64. * @access public
  65. * @param string $sessID
  66. */
  67. public function destroy($sessID) {
  68.  
  69. }
  70.  
  71. /**
  72. * Session 垃圾回收
  73. * @access public
  74. * @param string $sessMaxLifeTime
  75. */
  76. public function gc($sessMaxLifeTime) {
  77.  
  78. }
  79.  
  80. /**
  81. * 打开Session
  82. * @access public
  83. */
  84. public function execute() {
  85. session_set_save_handler(array(&$this,"open"),
  86. array(&$this,"close"),
  87. array(&$this,"read"),
  88. array(&$this,"write"),
  89. array(&$this,"destroy"),
  90. array(&$this,"gc"));
  91. }
  92. }

完整代码:

  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11.  
  12. defined('THINK_PATH') or exit();
  13. /**
  14. * 数据库方式Session驱动
  15. * CREATE TABLE think_session (
  16. * session_id varchar(255) NOT NULL,
  17. * session_expire int(11) NOT NULL,
  18. * session_data blob,
  19. * UNIQUE KEY `session_id` (`session_id`)
  20. * );
  21. * @category Extend
  22. * @package Extend
  23. * @subpackage Driver.Session
  24. * @author liu21st <liu21st@gmail.com>
  25. */
  26. class SessionDb {
  27.  
  28. /**
  29. * Session有效时间
  30. */
  31. protected $lifeTime = '';
  32.  
  33. /**
  34. * session保存的数据库名
  35. */
  36. protected $sessionTable = '';
  37.  
  38. /**
  39. * 数据库句柄
  40. */
  41. protected $hander = array();
  42.  
  43. /**
  44. * 打开Session
  45. * @access public
  46. * @param string $savePath
  47. * @param mixed $sessName
  48. */
  49. public function open($savePath, $sessName) {
  50. $this->lifeTime = C('SESSION_EXPIRE')?C('SESSION_EXPIRE'):ini_get('session.gc_maxlifetime');
  51. $this->sessionTable = C('SESSION_TABLE')?C('SESSION_TABLE'):C("DB_PREFIX")."session";
  52. //分布式数据库
  53. $host = explode(',',C('DB_HOST'));
  54. $port = explode(',',C('DB_PORT'));
  55. $name = explode(',',C('DB_NAME'));
  56. $user = explode(',',C('DB_USER'));
  57. $pwd = explode(',',C('DB_PWD'));
  58. if(1 == C('DB_DEPLOY_TYPE')){
  59. //读写分离
  60. if(C('DB_RW_SEPARATE')){
  61. $w = floor(mt_rand(0,C('DB_MASTER_NUM')-1));
  62. if(is_numeric(C('DB_SLAVE_NO'))){//指定服务器读
  63. $r = C('DB_SLAVE_NO');
  64. }else{
  65. $r = floor(mt_rand(C('DB_MASTER_NUM'),count($host)-1));
  66. }
  67. //主数据库链接
  68. $hander = mysql_connect(
  69. $host[$w].(isset($port[$w])?':'.$port[$w]:':'.$port[0]),
  70. isset($user[$w])?$user[$w]:$user[0],
  71. isset($pwd[$w])?$pwd[$w]:$pwd[0]
  72. );
  73. $dbSel = mysql_select_db(
  74. isset($name[$w])?$name[$w]:$name[0]
  75. ,$hander);
  76. if(!$hander || !$dbSel)
  77. return false;
  78. $this->hander[0] = $hander;
  79. //从数据库链接
  80. $hander = mysql_connect(
  81. $host[$r].(isset($port[$r])?':'.$port[$r]:':'.$port[0]),
  82. isset($user[$r])?$user[$r]:$user[0],
  83. isset($pwd[$r])?$pwd[$r]:$pwd[0]
  84. );
  85. $dbSel = mysql_select_db(
  86. isset($name[$r])?$name[$r]:$name[0]
  87. ,$hander);
  88. if(!$hander || !$dbSel)
  89. return false;
  90. $this->hander[1] = $hander;
  91. return true;
  92. }
  93. }
  94. //从数据库链接
  95. $r = floor(mt_rand(0,count($host)-1));
  96. $hander = mysql_connect(
  97. $host[$r].(isset($port[$r])?':'.$port[$r]:':'.$port[0]),
  98. isset($user[$r])?$user[$r]:$user[0],
  99. isset($pwd[$r])?$pwd[$r]:$pwd[0]
  100. );
  101. $dbSel = mysql_select_db(
  102. isset($name[$r])?$name[$r]:$name[0]
  103. ,$hander);
  104. if(!$hander || !$dbSel)
  105. return false;
  106. $this->hander = $hander;
  107. return true;
  108. }
  109.  
  110. /**
  111. * 关闭Session
  112. * @access public
  113. */
  114. public function close() {
  115. if(is_array($this->hander)){
  116. $this->gc($this->lifeTime);
  117. return (mysql_close($this->hander[0]) && mysql_close($this->hander[1]));
  118. }
  119. $this->gc($this->lifeTime);
  120. return mysql_close($this->hander);
  121. }
  122.  
  123. /**
  124. * 读取Session
  125. * @access public
  126. * @param string $sessID
  127. */
  128. public function read($sessID) {
  129. $hander = is_array($this->hander)?$this->hander[1]:$this->hander;
  130. $res = mysql_query("SELECT session_data AS data FROM ".$this->sessionTable." WHERE session_id = '$sessID' AND session_expire >".time(),$hander);
  131. if($res) {
  132. $row = mysql_fetch_assoc($res);
  133. return $row['data'];
  134. }
  135. return "";
  136. }
  137.  
  138. /**
  139. * 写入Session
  140. * @access public
  141. * @param string $sessID
  142. * @param String $sessData
  143. */
  144. public function write($sessID,$sessData) {
  145. $hander = is_array($this->hander)?$this->hander[0]:$this->hander;
  146. $expire = time() + $this->lifeTime;
    mysql_query("REPLACE INTO ".$this->sessionTable." (session_id, session_expire, session_data) VALUES( '$sessID', '$expire', '$sessData')",$hander);
  147. if(mysql_affected_rows($hander))
  148. return true;
  149. return false;
  150. }
  151.  
  152. /**
  153. * 删除Session
  154. * @access public
  155. * @param string $sessID
  156. */
  157. public function destroy($sessID) {
  158. $hander = is_array($this->hander)?$this->hander[0]:$this->hander;
  159. mysql_query("DELETE FROM ".$this->sessionTable." WHERE session_id = '$sessID'",$hander);
  160. if(mysql_affected_rows($hander))
  161. return true;
  162. return false;
  163. }
  164.  
  165. /**
  166. * Session 垃圾回收
  167. * @access public
  168. * @param string $sessMaxLifeTime
  169. */
  170. public function gc($sessMaxLifeTime) {
  171. $hander = is_array($this->hander)?$this->hander[0]:$this->hander;
  172. mysql_query("DELETE FROM ".$this->sessionTable." WHERE session_expire < ".time(),$hander);
  173. return mysql_affected_rows($hander);
  174. }
  175.  
  176. /**
  177. * 打开Session
  178. * @access public
  179. */
  180. public function execute() {
  181. session_set_save_handler(array(&$this,"open"),
  182. array(&$this,"close"),
  183. array(&$this,"read"),
  184. array(&$this,"write"),
  185. array(&$this,"destroy"),
  186. array(&$this,"gc"));
  187. }
  188. }

ThinkPHP - session 数据库存储驱动的更多相关文章

  1. 可灵活扩展的自定义Session状态存储驱动

    Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...

  2. jetty+mongodb 配置session外部数据库存储

    monbgodb简介 主页 http://www.mongodb.org/ oschina.net 介绍页 http://www.oschina.net/p/mongodb MongoDB是一个介于关 ...

  3. nginx 负载均衡、用数据库存储Session,来实现多站点共享Session[转]

    多站点共享Session常见的作法有: 1.使用.net自动的状态服务(Asp.net State Service); 2.使用.net的Session数据库: 3.使用Memcached. 4.使用 ...

  4. 多台web如何共享session进行存储(转载)

    session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点.我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢? php中 ...

  5. ASP.net 中关于Session的存储信息及其它方式存储信息的讨论与总结

    通过学习和实践笔者总结一下Session 的存储方式.虽然里面的理论众所周知,但是我还是想记录并整理一下.作为备忘录吧.除了ASP.net通过Web.config配置的方式,还有通过其它方式来存储的方 ...

  6. session的存储方式和配置

    Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.我们控制用户去权限中经常用到Session来存储用户状态,这篇文章会讲下Session的存储方式.在w ...

  7. thinkphp从数据库里的html代码显示页面不解析

    首先,这个问题不应该出现在这里,因为以前在用ThinkPHP3.1.2的时候,利用富文本编辑器保存文本后,直接从数据库里面取出的数据都能正常显示,改用ThinkPHP3.2.3之后,thinkphp从 ...

  8. 修改session的存储机制

    <?php  //修改session的存储机制 //最起码应该有一个 读方法, 和一个 写方法. //1, 我们先去建立 读方法 和 写方法. //2, 告知session系统,使用我们的方法完 ...

  9. Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程

    1.Session的由来及其实现 HTTP协议是无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的.也就是说我们无法在服务器端确认两次请求是否是同一个用户所为,这为我们在一些应用场景中实现 ...

随机推荐

  1. 2045不容易系列之(3)—— LELE的RPG难题

    Problem Description人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即”可乐”),经过多方打探,某资深Cole终于知道了原因,原 ...

  2. BZOJ 2466: [中山市选2009]树( 高斯消元 )

    高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...

  3. tomcat管理员manager app无法进入解决方法

    浏览器输入http://localhost:8080/进入tomcat页面后,点击manager app输入用户名(admin)密码(admin)后页面跳转出现如下错误:备注:tomcat7.0.39 ...

  4. c语言(3)--运算符&表达式&语句

    计算机的本职工作是进行一系列的运算,C语言为不同的运算提供了不同的运算符! 1.那些运算符们 .基本运算符 算术运算符:+ - * /  % ++ -- 赋值运算符:= 逗号运算符:, 关系运算符:& ...

  5. 【图文教程】用“iz3d”软件将您的游戏打造为红蓝3D游戏。

    iz3d是一款能将普通3D游戏转换为红蓝3D游戏的软件.基本上支持所有游戏,或许没用过的人会认为这只是类似于播放器中的一个小功能,将平面图形做成“伪3D”红蓝效果. 实际上不是的,游戏与平面图的结构不 ...

  6. Linux 动态库剖析

    进程与 API 动态链接的共享库是 GNU/Linux® 的一个重要方面.该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用.本文研究了创建和 ...

  7. MyReport报表引擎2.6.5.0新功能

    新的文本渲染引擎,打印旋转时保持文本高精度矢量输出,打印更清晰.  watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29uZ195ZWU=/font/5a6 ...

  8. SharePoint代码段设计

    参考文章: 1. SharePoint 2013设计管理器代码段 https://msdn.microsoft.com/zh-cn/library/jj822367 2. 如何在SharePoint中 ...

  9. html相关介绍

    HTML(超文本标记语言)  超文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言 XHTML1.0 可扩展超文本置标语言(eXtensi ...

  10. guava中eventbus注解使用

    guava是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.学会使用该库相关api的使用,能使我们代码更简洁,更优雅,本章节我们来谈谈 ...