PHP7实现SESSION保存到数据库

/ 浏览 3033 次

在深入PHP的MVC框架中遇到了session入库的这个操作,在看的学习教程中的PHP版本是PHP5+的环境。在php5+的版本中有session_set_save_handler这个方法可以实现用户自定义修改session入库,只需要实现open, close, read, write, destroy, gc方法就可以了,然后按照教程把实现的方法手打了一遍之后,硬是出现Fatal error: session_start(): Failed to initialize storage module: user...的错误,搜索引擎了一遍代码之后,仍然无法解决。

随后灵机一闪,我也把编程的环境也换成了PHP5+的环境,然后把session入库的方法重新敲了一遍,果不其然方法就可以实现了。随后去搜索引擎,搜了一遍关于PHP7中的session_set_save_handler说明之后再把环境换回去了PHP7+的版本。根据教程把方法和实例敲了一遍,在demo上算是成功的入库了。

然后根据自己写的mvc框架,把session封装成了类,方法实现到了基础控制类;

session 入库,创建数据库

drop DATABASE if EXISTS session;
create DATABASE session CHARSET utf8;
use session;
drop TABLE if EXISTS session;
create table session (
sess_id char(32) UNIQUE NOT NULL,
sess_info text,
sess_expire int not null default 0
)CHARSET utf8 ENGINE INNODB;

PHP实现代码

<?php

class MySessionHandler implements SessionHandlerInterface
{

    private static $_link = null;

    public function open($save_path, $name)
    {
        if(is_null(self::$_link)) {

            self::$_link = mysqli_connect("127.0.0.1", 'root', 8888, 'session');
        }
        if(!self::$_link) {
            return false;
        }
        return true;
    }

    public function read($session_id)
    {
        $sql = "SELECT * FROM session WHERE sess_id = '{$session_id}'";
        $result = mysqli_query(self::$_link, $sql);

        if($row = mysqli_fetch_assoc($result)) {

            return $row['sess_info'];
        }
        return '';

    }

    public function write($session_id, $session_data)
    {
        $time = time();
        $sql = "REPLACE INTO session (sess_id, sess_info, sess_expire) VALUES ('{$session_id}', '{$session_data}', $time)";
        return mysqli_query(self::$_link, $sql);
    }

    public function destroy($session_id)
    {
        $sql = "DELETE FROM session WHERE sess_id='{$session_id}'";
        return mysqli_query(self::$_link, $sql);
    }

    public function gc($maxlifetime)
    {
        $time = time() - ini_get('session.gc_maxlifetime');
        $sql = "DELETE FROM session WHERE sess_expire < {$time}";
        return mysqli_query(self::$_link, $sql);
    }

    public function close()
    {
        mysqli_close(self::$_link);
        return true;
    }
}
$sessionHandler = new MySessionHandler();
session_set_save_handler($sessionHandler, true);

session_start();

手札完!

如果你想转载,请注明来源或者出处 / 随便看看

  1. 吴尼玛
    吴尼玛 2018-02-21 05:54:27 / 删除评论 #回复 #32793

    我都是为了减少mysql的读取才存到session的

  2. 夏目贵志
    夏目贵志 2018-02-22 15:14:12 / 删除评论 #回复 #32795

    越来越厉害了23333,为什么没有代码高亮!!

    • 大雄
      大雄 2018-02-22 19:15:56 / 删除评论 #回复 #32797

      @夏目贵志:有的,你可能看不到而已,刷新就可以了。

      • 夏目贵志
        夏目贵志 2018-02-25 11:01:08 / 删除评论 #回复 #32801

        @大雄:好吧 我游览器问题 换了火狐就有了!

  3. 小俊
    小俊 2018-02-22 16:25:49 / 删除评论 #回复 #32796

    在我老大的眼里,看待数据库语句有*就会骂人,说需要那个就查询那个.

    • 大雄
      大雄 2018-02-22 19:16:17 / 删除评论 #回复 #32798

      @小俊:这个确实没错,需要哪个就查询哪个,我这个只是示例。

  4. 外码
    外码 2018-02-23 19:33:01 / 删除评论 #回复 #32799

    我都快要成专业的了

  5. hooyes
    hooyes 2018-03-03 08:51:38 / 删除评论 #回复 #32814

    不知道性能如何

「人生在世,留句话给我吧」

发表评论

人生在世,错别字在所难免,无需纠正,##修改表单信息##