使用数据库保存session的方法

来源:互联网 发布:网络作家系列小说 编辑:程序博客网 时间:2024/05/21 23:17

使用数据库保存session的方法,阅读使用数据库保存session的方法,php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。


因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。这里我们讨论的环境是linux+nginx+mysql+php

存储session数据的表结构如下:

CREATE TABLE `sessions` (  `skey` char(32) NOT NULL,  `expiry` int(11) unsigned NOT NULL,  `svalue` text NOT NULL,  PRIMARY KEY (`skey`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
<?php/** * Created by PhpStorm. * User: leyan * Date: 2016/6/12 * Time: 10:44 */class MySessionHandler implements SessionHandlerInterface{    public $mysqli;    public $EXPIRE_TIME = 3600;//过期时间    function open($save_path, $session_id)    {        // TODO: Implement open() method.        $this->mysqli = new Mysqli("localhost","root","root","test");        if ( mysqli_connect_errno ()) {            printf ( "Connect failed: %s\n" ,  mysqli_connect_error ());            exit();        }        return true;    }    function read($session_id)    {        // TODO: Implement read() method.        $res = $this->mysqli->query("select svalue from sessions where skey = $session_id");        //$row = $res->fetch_assoc();        return $res;    }    function write($session_id, $session_data)    {        // TODO: Implement write() method.        $expiry = time()+$this->EXPIRE_TIME;        $sql = "insert into sessions (svalue,skey,expiry)values('$session_data','$session_id',$expiry)";        $this->mysqli->query($sql);        return true;    }    //当session.gc_probability/session.gc_divisor == 1的时候会执行回收机制gc()    function gc($maxlifetime)    {        // TODO: Implement gc() method.        $sql = 'delete from sessions where expiry < '.time();        $this->mysqli->query($sql);        return true;    }    function close()    {        // TODO: Implement close() method.        return true;    }    function destroy($session_id)    {        // TODO: Implement destroy() method.        $this->mysqli->query("delete from sessions where skey = $session_id");        return true;    }}$handler = new MySessionHandler();session_set_save_handler($handler,true);session_start();#完成上面的代码之后就可以进行正常的session操作,而数据是保存在数据库中的//destoryunset($_SESSION['first']);//session_destroy();//write$_SESSION['first'] = 'test_one';//readecho $_SESSION['first'];
0 0
原创粉丝点击