摘要:字如其意,它的存在就是為了保持會話狀態。中的讓我們很方便的使用它,但是如果本身不提供這個功能,我們該如何實現呢且聽我慢慢忽悠。
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"));
是不是特別簡單呢?使用每個功能的時候多想一下它是怎么實現的,很多時候能夠讓我們快速定位到問題的所在~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29023.html
摘要:寫在前面在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。 寫在前面 在一款應用的整個生命周期,我們都會談及該應用的數據安全問題。用戶的合法性與數據的可見性是數據安全中非常重要的一部分。但是,一方面,不同的應用對于數據的合法性和可見性要求的維度與粒度都有所區別;另一方面,以當前微服務、多服務的架構方式,如何共享Sessi...
摘要:前言,又稱為會話控制,存儲特定用戶會話所需的屬性及配置信息。類先看構造函數居然啥屁事都沒干。由此基本得出推斷,并不是服務器原生支持,而是由服務程序自己創建管理。類老規矩,先看構造函數接收了實例傳來和,其他沒有做什么。 前言 Session,又稱為會話控制,存儲特定用戶會話所需的屬性及配置信息。存于服務器,在整個用戶會話中一直存在。 然而: session 到底是什么? session...
摘要:這篇文章的題目有點大,但這并不是說我自覺對爬蟲這塊有多大見解,我只不過是想將自己的一些經驗付諸于筆,對于如何寫一個爬蟲框架,我想一步一步地結合具體代碼來講述如何從零開始編寫一個自己的爬蟲框架年到如今,我花精力比較多的一個開源項目算是了,這是 showImg(https://segmentfault.com/img/remote/1460000018513379); 這篇文章的題目有點大...
閱讀 1107·2021-11-24 10:24
閱讀 2594·2021-11-22 13:54
閱讀 1000·2021-09-24 09:55
閱讀 3603·2019-08-30 15:54
閱讀 1318·2019-08-30 15:44
閱讀 1096·2019-08-30 14:23
閱讀 3203·2019-08-29 13:45
閱讀 1284·2019-08-29 11:19