资讯专栏INFORMATION COLUMN

如何自己实现session功能

xushaojieaaa / 985人阅读

摘要:字如其意,它的存在就是为了保持会话状态。中的让我们很方便的使用它,但是如果本身不提供这个功能,我们该如何实现呢且听我慢慢忽悠。

session字如其意,它的存在就是为了保持会话状态。PHP中的$_SESSION让我们很方便的使用它,但是如果PHP本身不提供这个功能,我们该如何实现呢?且听我慢慢忽悠。
session的实现原理

session本身的实现原理其实很简单,几句话就可以说完

用户首次访问时生成唯一ID(其实就是PHP中的session_id)

根据session_id作为唯一标示,生成session_id为名称的文件(储存session内容,当然也可以存到redis或者mysql中)

通过cookie下发session_id到客户端

用户再次访问时会通过cookie将session_id带上

服务端通过session_id获取对应的session内容(文件、Cache、数据库)

代码实现

下面是我通过PHP实现的一个简单的session功能类,用来演示具体的实现过程,只实现了写和读功能(没有考虑会话有效期、并发等问题)。

/**
 * Session类简单实现
 * @author zhjx922
 */
class Session
{
    //当前sessionId
    private $_sessionId;
    //session的储存路径
    private $_sessionPath = "/tmp/session";

    /**
     * 初始化sessionId
     */
    public function __construct()
    {
        if(isset($_COOKIE["PHPSESSID"]) && $this->checkSession($_COOKIE["PHPSESSID"])) {
            $this->_sessionId = $_COOKIE["PHPSESSID"];
        } else {
            $this->_sessionId = uniqid();
            setcookie("PHPSESSID", $this->_sessionId);
        }
    }

    /**
     * 设置session
     * @param string $key
     * @param mixed $value
     */
    public function setSession($key, $value)
    {
        $sessionInfo = $this->getSessionInfo();
        $sessionInfo[$key] = $value;
        $sessionFile =  "{$this->_sessionPath}/{$this->_sessionId}";
        file_put_contents($sessionFile, serialize($sessionInfo));
    }

    /**
     * 获取session
     * @param string $key
     * @return mixed
     */
    public function getSession($key)
    {
        return $this->getSessionInfo()[$key];
    }

    /**
     * 获取当前sessionId下的内容
     * @return array
     */
    private function getSessionInfo()
    {
        if(!is_dir($this->_sessionPath))
        {
            mkdir($this->_sessionPath);
        }

        $sessionFile =  "{$this->_sessionPath}/{$this->_sessionId}";
        if(is_file($sessionFile)) {
            $contents = file_get_contents($sessionFile);
            return unserialize($contents);
        }
        return [];
    }

    /**
     * 检查session是否有效
     * @param string $sessionId
     * @return bool
     */
    private function checkSession($sessionId)
    {
        $sessionFile =  "{$this->_sessionPath}/{$sessionId}";
        if(is_file($sessionFile)) {
            return true;
        }

        return false;
    }
}

使用方法如下

$session = new Session();
$session->setSession("a", "b"); //第二次访问时注释掉这行,验证下一行$session->getSession("a")输出的内容是否正确
var_dump($session->getSession("a"));

是不是特别简单呢?使用每个功能的时候多想一下它是怎么实现的,很多时候能够让我们快速定位到问题的所在~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29023.html

相关文章

  • 不用 Spring Security 可否?试试这个小而美的安全框架

    摘要:写在前面在一款应用的整个生命周期,我们都会谈及该应用的数据安全问题。用户的合法性与数据的可见性是数据安全中非常重要的一部分。 写在前面 在一款应用的整个生命周期,我们都会谈及该应用的数据安全问题。用户的合法性与数据的可见性是数据安全中非常重要的一部分。但是,一方面,不同的应用对于数据的合法性和可见性要求的维度与粒度都有所区别;另一方面,以当前微服务、多服务的架构方式,如何共享Sessi...

    toddmark 评论0 收藏0
  • 从koa-session源码解读session本质

    摘要:前言,又称为会话控制,存储特定用户会话所需的属性及配置信息。类先看构造函数居然啥屁事都没干。由此基本得出推断,并不是服务器原生支持,而是由服务程序自己创建管理。类老规矩,先看构造函数接收了实例传来和,其他没有做什么。 前言 Session,又称为会话控制,存储特定用户会话所需的属性及配置信息。存于服务器,在整个用户会话中一直存在。 然而: session 到底是什么? session...

    remcarpediem 评论0 收藏0
  • 如何实现一个Python爬虫框架

    摘要:这篇文章的题目有点大,但这并不是说我自觉对爬虫这块有多大见解,我只不过是想将自己的一些经验付诸于笔,对于如何写一个爬虫框架,我想一步一步地结合具体代码来讲述如何从零开始编写一个自己的爬虫框架年到如今,我花精力比较多的一个开源项目算是了,这是 showImg(https://segmentfault.com/img/remote/1460000018513379); 这篇文章的题目有点大...

    feng409 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<