Как означает слово “сеанс”, он существует для поддержания состояния разговора. $_session в PHP облегчает нам его использование, но если сам PHP не предоставляет эту функцию, как мы можем ее реализовать? И послушай меня.
Принцип осуществления сессии
Принцип реализации самой сессии очень прост, и вы можете закончить ее в нескольких словах
- Создайте уникальный идентификатор при первом доступе пользователя (фактически, в PHP
session_id
) - В соответствии с идентификатором сеанса в качестве уникального идентификатора создайте файл с идентификатором сеанса в качестве имени (сохраните содержимое сеанса, которое также можно сохранить в redis или MySQL).
- Распространять через cookie
идентификатор сеанса
клиенту - Когда пользователь снова получит доступ,
session_id
закроется - Передача сервера
идентификатор сеанса
Получение соответствующего содержимого сеанса (файл, кэш, база данных)
реализация кода
Ниже приведен простой класс функций сеанса, который я реализовал с помощью PHP, который используется для демонстрации конкретного процесса реализации. Он реализует только функции записи и чтения (без учета вопросов действительности сеанса, параллелизма и т.д.).
/** *Simple implementation of session class * @author zhjx922 */ class Session { //Current sessionid private $_sessionId; //Storage path of session private $_sessionPath = '/tmp/session'; /** *Initialize sessionid */ public function __construct() { if(isset($_COOKIE['PHPSESSID']) && $this->checkSession($_COOKIE['PHPSESSID'])) { $this->_sessionId = $_COOKIE['PHPSESSID']; } else { $this->_sessionId = uniqid(); setcookie("PHPSESSID", $this->_sessionId); } } /** *Set 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)); } /** *Get session * @param string $key * @return mixed */ public function getSession($key) { return $this->getSessionInfo()[$key]; } /** *Get the content under the current 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 []; } /** *Check if the session is valid * @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'); // comment out this line during the second access, and verify whether the output of the next line $session - > getsession ('a ') is correct var_dump($session->getSession('a'));
Это особенно просто? При использовании каждой функции больше думайте о том, как она реализована. Во многих случаях это позволяет нам быстро обнаружить проблему~