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 将图片按创建时间进行分类存储的实现代码
Jan 05 PHP
8个必备的PHP功能实例代码
Oct 27 PHP
php生成随机密码自定义函数代码(简单快速)
May 10 PHP
PHP 5.3新增魔术方法__invoke概述
Jul 23 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
php生成HTML文件的类方法
Oct 11 PHP
PHP使用PDO实现mysql防注入功能详解
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生成便于打印的网页
2006/10/09 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
python实现的多线程端口扫描功能示例
2017/01/21 Python
Python flask框架实现查询数据库并显示数据
2020/06/04 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
个人简历自我评价
2014/02/02 职场文书
运动会入场词200字
2014/02/15 职场文书
创新型城市实施方案
2014/03/06 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
电教室标语
2014/06/20 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
2015年环卫工作总结
2015/04/28 职场文书
尝试使用Python爬取城市租房信息
2022/04/12 Python