(PHP 5 >= 5.4.0, PHP 7, PHP 8)
SessionHandlerInterface - это интерфейс, который определяет минимальный прототип для создания пользовательского обработчика сессии. Для предоставления пользовательского обработчика сессии функции session_set_save_handler(), используя её ООП реализацию, класс должен реализовывать этот интерфейс.
Обратите внимание, что callback-методы этого класса созданы для внутренних вызовов PHP и не предназначены для вызовов из вашего кода.
Пример #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