本文作者:心月

php中将session存入数据库的方法(附代码)

心月IT博客 2019-03-12
php中将session存入数据库的方法(附代码)摘要:将SESSION数据存储于服务器是端是一种较安全的做法,但是设想一下,如果一个拥有用户几千万的大型网站,如果将所有用户SESSION数据全部存储于服务器端,将消耗巨大的服务器资源。所以程序员在制作大型网站时将SESSION存储于服务器端虽然安全,但却不是最好的选择。如果将SESSION数据存储于数据库中,那么就可以减轻服务器的压力同时数据也是比较安全的。

    将SESSION数据变量存储于服务器是端是一种较安全的做法,但是设想一下,像校内网这样的日访问量过亿,拥有用户几千万的大型网站,如果将所有用户SESSION数据全部存储于服务器端,将消耗巨大的服务器资源。所以程序员在制作大型网站时将SESSION存储于服务器端虽然安全,但却不是最好的选择。如果将SESSION数据存储于数据库中,那么就可以减轻服务器的压力同时数据也是比较安全的。

php程序如何将session数据存入数据库中呢?php程序在设计的时候给session预留了一个接口,我们可以通过 SessionHandlerInterface 这个接口 来实现自定义session机制,将session存入数据库中。代码如下:

<?php

class customerSession implements SessionHandlerInterface{

    private $lifetime;
    private $link;

    public function open($save_path, $name)
    {
        $this->lifetime=get_cfg_var('session.gc_maxlifetime');
        $this->link = mysqli_connect('localhost','root','root','test');
        if ($this->link){
            mysqli_set_charset($this->link,'UTF8');
            return true;
        }
        return false;
    }

    public function write($session_id, $session_data)
    {
        $session_id = mysqli_escape_string($this->link,$session_id);

        $sql = "SELECT * FROM session WHERE session_id ='{$session_id}'";
        $res = mysqli_query($this->link,$sql);
        $expires = time()+$this->lifetime;
        if (mysqli_num_rows($res)==1){
            $sql = " UPDATE session SET session_data =  '{$session_data}',expires = {$expires} WHERE session_id = '{$session_id}'";
        }else{
            $sql = " INSERT session VALUES('{$session_id}','{$session_data}','{$expires}')";
        }

        mysqli_query($this->link,$sql);
        return mysqli_affected_rows($this->link)==1;

    }

    public function read($session_id)
    {

        $session_id = mysqli_escape_string($this->link,$session_id);
        $sql = " SELECT * FROM session WHERE session_id = '{$session_id}'";
        $Rres = mysqli_query($this->link,$sql);

        if (mysqli_num_rows($Rres)==1){
            return mysqli_fetch_assoc($Rres)['session_data'];
        }
        return '';
    }

    public function destroy($session_id)
    {
        $session_id = mysqli_escape_string($this->link,$session_id);
        $sql = " DELETE FROM session WHERE session_id = '{$session_id}'";
        mysqli_query($this->link,$sql);
        return mysqli_affected_rows($this->link)==1;
    }

    public function gc($maxlifetime)
    {
        $sql = " DELETE FROM session WHERE expires<".time();
        mysqli_query($this->link,$sql);

        if (mysqli_affected_rows($this->link)>0){
            return true;
        }

        return false;
    }

    public function close()
    {
        mysqli_close($this->link);
        return true;
    }

}

mysqli_connect('localhost','root','root','test') 这里是session准备存储的数据库相关信息。

session的表结构图:

session数据表结构

表中三个字段的意思:session_id 就是常规session的id ,session_data 是存储到数据表中的session数据,session数据在数据表中的存储形式如下图:

session数据在数据表中的存储形式

expires:可以理解为session的过期时间,不过这个时间由session存入表的那一刻时间加上session数据的有效时间长短 最后得到的值。

将session存入数据库的类已经写好了,该怎么用呢:

<?php
    #session存入数据库 的使用方法
    require_once 'customerSession.php';
    $CustomerSession = new customerSession();
    ini_set('session.save_handler','user');
    session_set_save_handler($CustomerSession,true);
    session_start();

在使用的时候先引入上面创建的session自定义操作类,然后实例化,上面的使用方法中,除了自定义类的类名外,其他的内容都不能改,也不能少。

接下来的就可以和我们平常使用session一样了

session使用


文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2019-03-12
若转载请注明原文及出处:https://www.xinyueseo.com/other/174.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论