A classe SessionHandlerInterface

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

Introdução

SessionHandlerInterface é uma interface que define o protótipo mínimo para criar um manipulador de sessão personalizado. Para passar um manipulador de sessão personalizado para session_set_save_handler() usando invocação OOP (Orientada à Objetos), a classe deve implementar esta interface.

Note que os métodos de callbacks desta classe são projetos para serem chamados internamente pelo PHP e não para serem chamados pelo código do usuário.

Resumo da Interface

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
}

Exemplo #1 Exemplo usando SessionHandlerInterface

O exemplo a seguir apresenta um armazenamento de sessão baseada em arquivos semelhante aos manipuladores de gravação de sessão padrões do PHP files. Este exemplo poderia ser facilmente estendido para cobrir armazenamento em banco de dados usando sua engine de banco de dados favorita que seja suportada pelo PHP.

Note que é usado orientação à objetos com session_set_save_handler() e a função de encerramento (register_shutdown) é registrada usando sua respectiva flag. Isto é aconselhável ao registrar objetos como manipuladores de gravação de sessão.

Cuidado

Por brevidade, este exemplo omite a validação de entrada. No entanto, o Os parâmetros $id são, na verdade, valores fornecidos pelo usuário que exigem validação/sanitização adequada para evitar vulnerabilidades, como problemas de passagem de caminho. Portanto, não use este exemplo não modificado em ambientes de produção.

<?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();

// proceder para definir e recuperar valores pela chave de $_SESSION

Índice

To Top