亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

如何自己實(shí)現(xiàn)session功能

xushaojieaaa / 1222人閱讀

摘要:字如其意,它的存在就是為了保持會(huì)話狀態(tài)。中的讓我們很方便的使用它,但是如果本身不提供這個(gè)功能,我們?cè)撊绾螌?shí)現(xiàn)呢且聽(tīng)我慢慢忽悠。

session字如其意,它的存在就是為了保持會(huì)話狀態(tài)。PHP中的$_SESSION讓我們很方便的使用它,但是如果PHP本身不提供這個(gè)功能,我們?cè)撊绾螌?shí)現(xiàn)呢?且聽(tīng)我慢慢忽悠。
session的實(shí)現(xiàn)原理

session本身的實(shí)現(xiàn)原理其實(shí)很簡(jiǎn)單,幾句話就可以說(shuō)完

用戶首次訪問(wèn)時(shí)生成唯一ID(其實(shí)就是PHP中的session_id)

根據(jù)session_id作為唯一標(biāo)示,生成session_id為名稱的文件(儲(chǔ)存session內(nèi)容,當(dāng)然也可以存到redis或者mysql中)

通過(guò)cookie下發(fā)session_id到客戶端

用戶再次訪問(wèn)時(shí)會(huì)通過(guò)cookie將session_id帶上

服務(wù)端通過(guò)session_id獲取對(duì)應(yīng)的session內(nèi)容(文件、Cache、數(shù)據(jù)庫(kù))

代碼實(shí)現(xiàn)

下面是我通過(guò)PHP實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的session功能類,用來(lái)演示具體的實(shí)現(xiàn)過(guò)程,只實(shí)現(xiàn)了寫和讀功能(沒(méi)有考慮會(huì)話有效期、并發(fā)等問(wèn)題)。

/**
 * Session類簡(jiǎn)單實(shí)現(xiàn)
 * @author zhjx922
 */
class Session
{
    //當(dāng)前sessionId
    private $_sessionId;
    //session的儲(chǔ)存路徑
    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);
        }
    }

    /**
     * 設(shè)置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];
    }

    /**
     * 獲取當(dāng)前sessionId下的內(nèi)容
     * @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"); //第二次訪問(wèn)時(shí)注釋掉這行,驗(yàn)證下一行$session->getSession("a")輸出的內(nèi)容是否正確
var_dump($session->getSession("a"));

是不是特別簡(jiǎn)單呢?使用每個(gè)功能的時(shí)候多想一下它是怎么實(shí)現(xiàn)的,很多時(shí)候能夠讓我們快速定位到問(wèn)題的所在~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29023.html

相關(guān)文章

  • 不用 Spring Security 可否?試試這個(gè)小而美的安全框架

    摘要:寫在前面在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問(wèn)題。用戶的合法性與數(shù)據(jù)的可見(jiàn)性是數(shù)據(jù)安全中非常重要的一部分。 寫在前面 在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問(wèn)題。用戶的合法性與數(shù)據(jù)的可見(jiàn)性是數(shù)據(jù)安全中非常重要的一部分。但是,一方面,不同的應(yīng)用對(duì)于數(shù)據(jù)的合法性和可見(jiàn)性要求的維度與粒度都有所區(qū)別;另一方面,以當(dāng)前微服務(wù)、多服務(wù)的架構(gòu)方式,如何共享Sessi...

    toddmark 評(píng)論0 收藏0
  • 從koa-session源碼解讀session本質(zhì)

    摘要:前言,又稱為會(huì)話控制,存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。類先看構(gòu)造函數(shù)居然啥屁事都沒(méi)干。由此基本得出推斷,并不是服務(wù)器原生支持,而是由服務(wù)程序自己創(chuàng)建管理。類老規(guī)矩,先看構(gòu)造函數(shù)接收了實(shí)例傳來(lái)和,其他沒(méi)有做什么。 前言 Session,又稱為會(huì)話控制,存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。存于服務(wù)器,在整個(gè)用戶會(huì)話中一直存在。 然而: session 到底是什么? session...

    remcarpediem 評(píng)論0 收藏0
  • 如何實(shí)現(xiàn)一個(gè)Python爬蟲框架

    摘要:這篇文章的題目有點(diǎn)大,但這并不是說(shuō)我自覺(jué)對(duì)爬蟲這塊有多大見(jiàn)解,我只不過(guò)是想將自己的一些經(jīng)驗(yàn)付諸于筆,對(duì)于如何寫一個(gè)爬蟲框架,我想一步一步地結(jié)合具體代碼來(lái)講述如何從零開(kāi)始編寫一個(gè)自己的爬蟲框架年到如今,我花精力比較多的一個(gè)開(kāi)源項(xiàng)目算是了,這是 showImg(https://segmentfault.com/img/remote/1460000018513379); 這篇文章的題目有點(diǎn)大...

    feng409 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<