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 相关文章推荐
PHP 和 XML: 使用expat函数(三)
Oct 09 PHP
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
小谈php正则提取图片地址
Mar 27 PHP
destoon常用的安全设置概述
Jun 21 PHP
php中socket的用法详解
Oct 24 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
Jun 21 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 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获取参数的几种方法总结
2014/02/18 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
深入理解JavaScript定时机制
2016/10/27 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
numpy排序与集合运算用法示例
2017/12/15 Python
Python多层装饰器用法实例分析
2018/02/09 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
python使用requests.session模拟登录
2019/08/09 Python
Python自动创建Excel并获取内容
2020/09/16 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
介绍下Java的输入输出流
2014/01/22 面试题
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
教师个人剖析材料
2014/02/05 职场文书
求职毕业生自荐书
2014/02/08 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
会计系毕业求职信
2014/08/07 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python