PHP7实现SESSION保存到数据库

在深入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();

手札完!

Comments: 7

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

提交评论