使用数据库保存session的方法

使用数据库保存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操作,而数据是保存在数据库中的
//destory
unset($_SESSION['first']);
//session_destroy();
//write
$_SESSION['first'] = 'test_one';
//read
echo $_SESSION['first'];
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值