ThinkPHP - session 数据库存储驱动
命名格式:
Session + 驱动名称 + .class.php
所有的方法要有,但不一定要实现。
- <?php
- /**
- * @category Extend
- * @package Extend
- * @subpackage Driver.Session
- * @author liu21st <liu21st@gmail.com>
- */
- class SessionDb {
- /**
- * Session有效时间
- */
- protected $lifeTime = '';
- /**
- * session保存的数据库名
- */
- protected $sessionTable = '';
- /**
- * 数据库句柄
- */
- protected $hander = array();
- /**
- * 打开Session
- * @access public
- * @param string $savePath
- * @param mixed $sessName
- */
- public function open($savePath, $sessName) {
- }
- /**
- * 关闭Session
- * @access public
- */
- public function close() {
- }
- /**
- * 读取Session
- * @access public
- * @param string $sessID
- */
- public function read($sessID) {
- }
- /**
- * 写入Session
- * @access public
- * @param string $sessID
- * @param String $sessData
- */
- public function write($sessID,$sessData) {
- }
- /**
- * 删除Session
- * @access public
- * @param string $sessID
- */
- public function destroy($sessID) {
- }
- /**
- * Session 垃圾回收
- * @access public
- * @param string $sessMaxLifeTime
- */
- public function gc($sessMaxLifeTime) {
- }
- /**
- * 打开Session
- * @access public
- */
- public function execute() {
- session_set_save_handler(array(&$this,"open"),
- array(&$this,"close"),
- array(&$this,"read"),
- array(&$this,"write"),
- array(&$this,"destroy"),
- array(&$this,"gc"));
- }
- }
完整代码:
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: liu21st <liu21st@gmail.com>
- // +----------------------------------------------------------------------
- defined('THINK_PATH') or exit();
- /**
- * 数据库方式Session驱动
- * CREATE TABLE think_session (
- * session_id varchar(255) NOT NULL,
- * session_expire int(11) NOT NULL,
- * session_data blob,
- * UNIQUE KEY `session_id` (`session_id`)
- * );
- * @category Extend
- * @package Extend
- * @subpackage Driver.Session
- * @author liu21st <liu21st@gmail.com>
- */
- class SessionDb {
- /**
- * Session有效时间
- */
- protected $lifeTime = '';
- /**
- * session保存的数据库名
- */
- protected $sessionTable = '';
- /**
- * 数据库句柄
- */
- protected $hander = array();
- /**
- * 打开Session
- * @access public
- * @param string $savePath
- * @param mixed $sessName
- */
- public function open($savePath, $sessName) {
- $this->lifeTime = C('SESSION_EXPIRE')?C('SESSION_EXPIRE'):ini_get('session.gc_maxlifetime');
- $this->sessionTable = C('SESSION_TABLE')?C('SESSION_TABLE'):C("DB_PREFIX")."session";
- //分布式数据库
- $host = explode(',',C('DB_HOST'));
- $port = explode(',',C('DB_PORT'));
- $name = explode(',',C('DB_NAME'));
- $user = explode(',',C('DB_USER'));
- $pwd = explode(',',C('DB_PWD'));
- if(1 == C('DB_DEPLOY_TYPE')){
- //读写分离
- if(C('DB_RW_SEPARATE')){
- $w = floor(mt_rand(0,C('DB_MASTER_NUM')-1));
- if(is_numeric(C('DB_SLAVE_NO'))){//指定服务器读
- $r = C('DB_SLAVE_NO');
- }else{
- $r = floor(mt_rand(C('DB_MASTER_NUM'),count($host)-1));
- }
- //主数据库链接
- $hander = mysql_connect(
- $host[$w].(isset($port[$w])?':'.$port[$w]:':'.$port[0]),
- isset($user[$w])?$user[$w]:$user[0],
- isset($pwd[$w])?$pwd[$w]:$pwd[0]
- );
- $dbSel = mysql_select_db(
- isset($name[$w])?$name[$w]:$name[0]
- ,$hander);
- if(!$hander || !$dbSel)
- return false;
- $this->hander[0] = $hander;
- //从数据库链接
- $hander = mysql_connect(
- $host[$r].(isset($port[$r])?':'.$port[$r]:':'.$port[0]),
- isset($user[$r])?$user[$r]:$user[0],
- isset($pwd[$r])?$pwd[$r]:$pwd[0]
- );
- $dbSel = mysql_select_db(
- isset($name[$r])?$name[$r]:$name[0]
- ,$hander);
- if(!$hander || !$dbSel)
- return false;
- $this->hander[1] = $hander;
- return true;
- }
- }
- //从数据库链接
- $r = floor(mt_rand(0,count($host)-1));
- $hander = mysql_connect(
- $host[$r].(isset($port[$r])?':'.$port[$r]:':'.$port[0]),
- isset($user[$r])?$user[$r]:$user[0],
- isset($pwd[$r])?$pwd[$r]:$pwd[0]
- );
- $dbSel = mysql_select_db(
- isset($name[$r])?$name[$r]:$name[0]
- ,$hander);
- if(!$hander || !$dbSel)
- return false;
- $this->hander = $hander;
- return true;
- }
- /**
- * 关闭Session
- * @access public
- */
- public function close() {
- if(is_array($this->hander)){
- $this->gc($this->lifeTime);
- return (mysql_close($this->hander[0]) && mysql_close($this->hander[1]));
- }
- $this->gc($this->lifeTime);
- return mysql_close($this->hander);
- }
- /**
- * 读取Session
- * @access public
- * @param string $sessID
- */
- public function read($sessID) {
- $hander = is_array($this->hander)?$this->hander[1]:$this->hander;
- $res = mysql_query("SELECT session_data AS data FROM ".$this->sessionTable." WHERE session_id = '$sessID' AND session_expire >".time(),$hander);
- if($res) {
- $row = mysql_fetch_assoc($res);
- return $row['data'];
- }
- return "";
- }
- /**
- * 写入Session
- * @access public
- * @param string $sessID
- * @param String $sessData
- */
- public function write($sessID,$sessData) {
- $hander = is_array($this->hander)?$this->hander[0]:$this->hander;
- $expire = time() + $this->lifeTime;
mysql_query("REPLACE INTO ".$this->sessionTable." (session_id, session_expire, session_data) VALUES( '$sessID', '$expire', '$sessData')",$hander);- if(mysql_affected_rows($hander))
- return true;
- return false;
- }
- /**
- * 删除Session
- * @access public
- * @param string $sessID
- */
- public function destroy($sessID) {
- $hander = is_array($this->hander)?$this->hander[0]:$this->hander;
- mysql_query("DELETE FROM ".$this->sessionTable." WHERE session_id = '$sessID'",$hander);
- if(mysql_affected_rows($hander))
- return true;
- return false;
- }
- /**
- * Session 垃圾回收
- * @access public
- * @param string $sessMaxLifeTime
- */
- public function gc($sessMaxLifeTime) {
- $hander = is_array($this->hander)?$this->hander[0]:$this->hander;
- mysql_query("DELETE FROM ".$this->sessionTable." WHERE session_expire < ".time(),$hander);
- return mysql_affected_rows($hander);
- }
- /**
- * 打开Session
- * @access public
- */
- public function execute() {
- session_set_save_handler(array(&$this,"open"),
- array(&$this,"close"),
- array(&$this,"read"),
- array(&$this,"write"),
- array(&$this,"destroy"),
- array(&$this,"gc"));
- }
- }
ThinkPHP - session 数据库存储驱动的更多相关文章
- 可灵活扩展的自定义Session状态存储驱动
Session是互联网应用中非常重要的玩意儿,对于超过单台部署的站点集群,都会存在会话共享的需求.在web.config中,微软提供了sessionstate节点来定义不同的Session状态存储方式 ...
- jetty+mongodb 配置session外部数据库存储
monbgodb简介 主页 http://www.mongodb.org/ oschina.net 介绍页 http://www.oschina.net/p/mongodb MongoDB是一个介于关 ...
- nginx 负载均衡、用数据库存储Session,来实现多站点共享Session[转]
多站点共享Session常见的作法有: 1.使用.net自动的状态服务(Asp.net State Service); 2.使用.net的Session数据库: 3.使用Memcached. 4.使用 ...
- 多台web如何共享session进行存储(转载)
session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点.我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢? php中 ...
- ASP.net 中关于Session的存储信息及其它方式存储信息的讨论与总结
通过学习和实践笔者总结一下Session 的存储方式.虽然里面的理论众所周知,但是我还是想记录并整理一下.作为备忘录吧.除了ASP.net通过Web.config配置的方式,还有通过其它方式来存储的方 ...
- session的存储方式和配置
Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.我们控制用户去权限中经常用到Session来存储用户状态,这篇文章会讲下Session的存储方式.在w ...
- thinkphp从数据库里的html代码显示页面不解析
首先,这个问题不应该出现在这里,因为以前在用ThinkPHP3.1.2的时候,利用富文本编辑器保存文本后,直接从数据库里面取出的数据都能正常显示,改用ThinkPHP3.2.3之后,thinkphp从 ...
- 修改session的存储机制
<?php //修改session的存储机制 //最起码应该有一个 读方法, 和一个 写方法. //1, 我们先去建立 读方法 和 写方法. //2, 告知session系统,使用我们的方法完 ...
- Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
1.Session的由来及其实现 HTTP协议是无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系的.也就是说我们无法在服务器端确认两次请求是否是同一个用户所为,这为我们在一些应用场景中实现 ...
随机推荐
- 2045不容易系列之(3)—— LELE的RPG难题
Problem Description人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即”可乐”),经过多方打探,某资深Cole终于知道了原因,原 ...
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...
- tomcat管理员manager app无法进入解决方法
浏览器输入http://localhost:8080/进入tomcat页面后,点击manager app输入用户名(admin)密码(admin)后页面跳转出现如下错误:备注:tomcat7.0.39 ...
- c语言(3)--运算符&表达式&语句
计算机的本职工作是进行一系列的运算,C语言为不同的运算提供了不同的运算符! 1.那些运算符们 .基本运算符 算术运算符:+ - * / % ++ -- 赋值运算符:= 逗号运算符:, 关系运算符:& ...
- 【图文教程】用“iz3d”软件将您的游戏打造为红蓝3D游戏。
iz3d是一款能将普通3D游戏转换为红蓝3D游戏的软件.基本上支持所有游戏,或许没用过的人会认为这只是类似于播放器中的一个小功能,将平面图形做成“伪3D”红蓝效果. 实际上不是的,游戏与平面图的结构不 ...
- Linux 动态库剖析
进程与 API 动态链接的共享库是 GNU/Linux® 的一个重要方面.该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用.本文研究了创建和 ...
- MyReport报表引擎2.6.5.0新功能
新的文本渲染引擎,打印旋转时保持文本高精度矢量输出,打印更清晰. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva29uZ195ZWU=/font/5a6 ...
- SharePoint代码段设计
参考文章: 1. SharePoint 2013设计管理器代码段 https://msdn.microsoft.com/zh-cn/library/jj822367 2. 如何在SharePoint中 ...
- html相关介绍
HTML(超文本标记语言) 超文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言 XHTML1.0 可扩展超文本置标语言(eXtensi ...
- guava中eventbus注解使用
guava是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.学会使用该库相关api的使用,能使我们代码更简洁,更优雅,本章节我们来谈谈 ...