Как означает слово “сеанс”, он существует для поддержания состояния разговора. $_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'));Это особенно просто? При использовании каждой функции больше думайте о том, как она реализована. Во многих случаях это позволяет нам быстро обнаружить проблему~