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

interface SessionHandlerInterface {
/* Métodos */
public close(): bool
public destroy(string $id): bool
public gc(int $max_lifetime): int|false
public open(string $path, string $name): bool
public read(string $id): string|false
public write(string $id, string $data): bool
}

Exemplos

Example #1 Exemplo usando SessionHandlerInterface

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.

Caution

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

Table of Contents