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中unset,array_splice删除数组中元素的区别
Jul 28 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
Sep 29 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
php解决DOM乱码的方法示例代码
Nov 20 PHP
php实现小程序支付完整版
Oct 09 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 PHP
PHP实现的杨辉三角求解算法分析
Mar 11 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
php源码的使用方法讲解
Sep 26 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 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检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
thinkPHP事务操作简单案例分析
2019/10/17 PHP
js判断变量是否未定义的代码
2020/03/28 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
python encode和decode的妙用
2009/09/02 Python
python实现文本文件合并
2015/12/29 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
基于python实现从尾到头打印链表
2019/11/02 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
大专学生求职信
2014/07/04 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
辩论会主持词
2015/07/03 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang