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 相关文章推荐
模仿OSO的论坛(四)
Oct 09 PHP
php读取30天之内的根据算法排序的代码
Apr 06 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
PHP开启gzip页面压缩实例代码
Mar 11 PHP
windows下开发并编译PHP扩展的方法
Mar 18 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
Jun 06 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
php解析http获取的json字符串变量总是空白null
Mar 02 PHP
laravel中命名路由的使用方法
Feb 24 PHP
php中的explode()函数实例介绍
Jan 18 PHP
php实现断点续传大文件示例代码
Jun 19 PHP
jQuery+PHP实现图片上传并提交功能
Jul 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调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
php验证session无效的解决方法
2014/11/04 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
python从入门到精通(DAY 1)
2015/12/20 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
深入理解Python装饰器
2016/07/27 Python
Python解惑之True和False详解
2017/04/24 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
网页美工求职信
2014/02/15 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
食堂管理制度范本
2015/08/04 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
Python基础之Socket通信原理
2021/04/22 Python
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python