Класс SessionHandlerInterface

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

Введение

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

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

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

interfaceSessionHandlerInterface {
publicclose(): bool
publicdestroy(string$id): bool
publicgc(int$max_lifetime): int|false
publicopen(string$path, string$name): bool
publicread(string$id): string|false
publicwrite(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

Содержание

To Top