zoukankan      html  css  js  c++  java
  • 如何自己实现session功能

    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://segmentfault.com/a/1190000015606464

  • 相关阅读:
    javascript私有静态成员
    javascript公有静态成员
    javascript沙箱模式
    javascript构造函数模块
    javascript模块模式
    javascript私有方法揭示为公有方法
    javascript命名空间
    javascript构造函数强制使用new
    javascript惰性函数
    javascript柯里化
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9980012.html
Copyright © 2011-2022 走看看