Класс SessionHandlerInterface

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

Введение

SessionHandlerInterface — интерфейс, который определяет минимальный прототип для создания пользовательского обработчика сессии. Для предоставления пользовательского обработчика сессии функции session_set_save_handler(), используя её ООП реализацию, класс должен реализовывать этот интерфейс.

Обратите внимание, что callback-методы этого класса созданы для внутренних вызовов PHP и не предназначены для вызовов из вашего кода.

Обзор интерфейса

interface SessionHandlerInterface {
/* Методы */
public function close(): bool
public function destroy(string $id): bool
public function gc(int $max_lifetime): int|false
public function open(string $path, string $name): bool
public function read(string $id): string|false
public function write(string $id, string $data): bool
}

Примеры

Пример #1 Пример использования класса SessionHandlerInterface

Следующий пример реализует файловую сессию таким же образом, как это реализовано во внутреннем обработчике сессии PHP. Этот пример может быть легко расширен для обеспечения хранения сессий в предпочитаемой вами базе данных.

Обратите внимание, что мы используем объектно-ориентированные прототипы с функцией session_set_save_handler() и регистрируем функцию завершения (shutdown) используя один из параметров этой функции. Это действие рекомендуется производить в большинстве случаев, когда объекты регистрируются в качестве обработчиков сессии.

Предостережение

Для краткости в этом примере не добавлена проверка входных данных. Обратите внимание, что параметр $id предоставляется пользователем и обязательно должен проверяться для исключения возможных атак, использующих, например, проблемы обхода пути. Так что ни в коем случае не используйте этот код в промышленной эксплуатации, не добавив соответствующие проверки.

<?php

class MySessionHandler implements SessionHandlerInterface
{
    private $savePath;

    public function open($savePath, $sessionName): bool
    {
        $this->savePath = $savePath;
        if (!is_dir($this->savePath)) {
            mkdir($this->savePath, 0777);
        }
        return true;
    }

    public function close(): bool
    {
        return true;
    }

    #[\ReturnTypeWillChange]
    public function read($id)
    {
        return (string) @file_get_contents("$this->savePath/sess_$id");
    }

    public function write($id, $data): bool
    {
        return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
    }

    public function destroy($id): bool
    {
        $file = "$this->savePath/sess_$id";
        if (file_exists($file)) {
            unlink($file);
        }
        return true;
    }

    #[\ReturnTypeWillChange]
    public function gc($maxlifetime)
    {
        foreach (glob("$this->savePath/sess_*") as $file) {
            if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
                unlink($file);
            }
        }
        return true;
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

// Продолжаем работать с переменными сессии, устанавливая или читая их значение из суперглобальной переменной $_SESSION

?>

Содержание