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版)
Oct 09 PHP
php array_unique之后json_encode需要注意
Jan 02 PHP
PHP include_path设置技巧分享
Jul 03 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
Jan 09 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
Laravel模型事件的实现原理详解
Mar 14 PHP
PHP simplexml_load_file()函数讲解
Feb 03 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
广播爱好者需要了解的天线知识
2021/03/01 无线电
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
AngularJS语法详解
2015/01/23 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
Python实现Logger打印功能的方法详解
2017/09/01 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
python对html过滤处理的方法
2018/10/21 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
Python偏函数实现原理及应用
2020/11/20 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
家庭户外服装:Hawkshead
2017/11/02 全球购物
银行门卫岗位职责
2013/12/29 职场文书
素质拓展感言
2014/01/29 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
你真的会用Mysql的explain吗
2022/03/31 MySQL
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技