O exemplo a seguir fornece um armazenamento de sessão baseado em arquivos similar ao
manipulador de gravação padrão de sessões do PHP, files. Este
exemplo poderia facilmente ser estendido para cobrir armazenamento em banco de dados usando
o motor de banco de dados de sua preferência suportado pelo PHP.
Observe que é usado o protótipo orientado a objetos com session_set_save_handler() e
a função de encerramento (register_shutdown) é registrada usando a opção de parâmetro da função. Isto é
geralmente 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
parâmetros $id são, na verdade, valores fornecidos pelo usuário que
exigem validação e sanitização adequadas 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