El siguiente ejemplo proporciona almacenamiento de sesiones basado en ficheros similar al
gestor de almacenamiento de sesiones predeterminado de PHP files
. Este
ejemplo podría fácilmente ser extendido para cubrir almacenamiento de bases de datos usando su
motor de bases de datos favorito soportado por PHP.
Observe que usamos el prototipo de POO con session_set_save_handler() y
registramos la función de cierre usando la bandera de parámetro de la función. Esto normalmente es
aconsejable al registrar objetos como gestores de almacenamiento de sesiones.
Precaución
Por razones de brevedad, este ejemplo omite la validación de entradas. Sin embargo,
los parámetros $id
son en realidad valores suministrados por el usuario
que requieren una validación/sanitización adecuada para evitar vulnerabilidades, como
problemas de recorrido o cruce en la ruta de acceso. Así que no utilice este ejemplo
sin modificar en entornos de producción.
<?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();
// proceed to set and retrieve values by key from $_SESSION