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 相关文章推荐
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
PHP+MySQL5.0中文乱码解决方法
Nov 20 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
php下载文件的代码示例
Jun 29 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
php采用curl实现伪造IP来源的方法
Nov 21 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
Composer设置忽略版本匹配的方法
Apr 27 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 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正则表达式使用的详细介绍
2013/04/27 PHP
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
JavaScript类和继承 constructor属性
2010/03/04 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
Bootstrap carousel轮转图的使用实例详解
2016/05/17 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
Python实例一个类背后发生了什么
2016/02/09 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
python实现一组典型数据格式转换
2018/12/15 Python
简单了解python单例模式的几种写法
2019/07/01 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
澳大利亚百货公司:David Jones
2018/02/08 全球购物
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
2013/06/07 面试题
连带责任保证书
2014/04/29 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
工作说明书格式
2014/07/29 职场文书
创业计划书之水果店
2019/07/18 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
MySQL分库分表详情
2021/09/25 MySQL
警用民用对讲机找不同
2022/02/18 无线电
Python实现视频自动打码的示例代码
2022/04/08 Python