PHP将session信息存储到数据库的类实例


Posted in PHP onMarch 04, 2015

本文实例讲述了PHP将session信息存储到数据库的类。分享给大家供大家参考。具体分析如下:

SessionHandlerInterface接口是PHP内置的接口,直接实现就行了
具体可以看php手册关于session_set_save_handler函数的解释!

PHP代码如下:

/**

* session信息存储到数据库的类

* 表结构:

* CREATE TABLE IF NOT EXISTS `sessioninfo` (

*  `sid` varchar(255) NOT NULL,

*  `value` text NOT NULL,

*  `expiration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

*  PRIMARY KEY (`sid`)

* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

*/

class MySessionHandler implements SessionHandlerInterface {

    /**

    * @access private

    * @var object 数据库连接

    */

    private $_dbLink;

    /**

    * @access private

    * @var string 保存session的表名

    */

    Private $_sessionTable;

    /**

    * @access private

    * @var string session名

    */

    private $_sessionName;

    /**

    * @const 过期时间

    */

    const SESSION_EXPIRE = 10;

    public function __construct($dbLink, $sessionTable) {

        if(!is_object($dbLink)) {

            return false;

        }

        $this->_dbLink = $dbLink;

        $this->_sessionTable = $sessionTable;

    }

    /**

    * 打开

    * @access public

    * @param string $session_save_path 保存session的路径

    * @param string $session_name session名

    * @return integer

    */

    public function open($session_save_path, $session_name) {

        $this->_sessionName = $session_name;

        return 0;

    }

    /**

    * 关闭

    * @access public

    * @return integer

    */

    public function close() {

        return 0;

    }

    /**

    * 关闭session

    * @access public

    * @param string $session_id session ID

    * @return string

    */

    public function read($session_id) {

        $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = {$session_id} AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";

        $result = $this->_dbLink->query($query);

        if(!isset($value) || empty($value)) {

            $value = "";

            return $value;

        }

        $this->_dbLink->query("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = {$session_id}");

        $value = $result->fetch_array();

        $result->free();

        return $value['value'];

    }

    /**

    * 写入session

    * @access public

    * @param string $session_id session ID

    * @param string $session_data session data

    * @return integer

    */

    public function write($session_id, $session_data) {

        $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";

        $result = $this->_dbLink->query($query);

        $result = $result->fetch_array();

        if(!empty($result)) {

            $result = $this->_dbLink->query("UPDATE {$this->_sessionTable} SET value = {$session_data} WHERE sid = {$session_id}");

        }

        else{

            $result = $this->_dbLink->query("INSERT INTO {$this->_sessionTable} (sid, value) VALUES ('{$session_id}', '{$session_data}')");

        }

        if($result){

            return 0;

        }

        else{

            return 1;

        }       

    }

    /**

    * 销魂session

    * @access public

    * @param string $session_id session ID

    * @return integer

    */

    public function destroy($session_id) {

        $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE sid = '{$session_id}'");

        if($result){

            return 0;

        }

        else{

            return 1;

        }

    }

    /**

    * 垃圾回收

    * @access public

    * @param string $maxlifetime session 最长生存时间

    * @return integer

    */

    public function gc($maxlifetime) {

        $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE UNIX_TIMESTAMP(expiration) < UNIX_TIMESTAMP(NOW()) - " . self::SESSION_EXPIRE);

        if($result){

            return 0;

        }

        else{

            return 1;

        }

    }

}

$dbLink = new mysqli("localhost", "root", "root", "test");

$sessionTable = "sessioninfo";

$handler = new MySessionHandler($dbLink, $sessionTable);

session_set_save_handler($handler);

session_start();

$_SESSION['name'] = "test";

echo $_SESSION["name"];

//session_destroy();

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
给多个地址发邮件的类
Oct 09 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 PHP
PHP实现链式操作的原理详解
Sep 16 PHP
php组合排序简单实现方法
Oct 15 PHP
浅谈PHP命令执行php文件需要注意的问题
Dec 16 PHP
PHP静态成员变量
Feb 14 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 PHP
php微信支付之APP支付方法
Mar 04 #PHP
php支付宝手机网页支付类实例
Mar 04 #PHP
php银联网页支付实现方法
Mar 04 #PHP
php随机抽奖实例分析
Mar 04 #PHP
php二维数组合并及去重复的方法
Mar 04 #PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 #PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 #PHP
You might like
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
python科学计算之scipy——optimize用法
2019/11/25 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
python 的topk算法实例
2020/04/02 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
python如何实现递归转非递归
2021/02/25 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
新大陆软件面试题
2016/11/24 面试题
平民服装店创业计划书
2014/01/17 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
采购经理岗位职责
2014/02/16 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书