Рубрики
Uncategorized

Как самостоятельно реализовать функцию сеанса

Автор оригинала: David Wong.

Как означает слово “сеанс”, он существует для поддержания состояния разговора. $_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'));

Это особенно просто? При использовании каждой функции больше думайте о том, как она реализована. Во многих случаях это позволяет нам быстро обнаружить проблему~