session_set_save_handler în PHP

Sesiuni și cookie-uri PHP 4+ (cu obiect: PHP 5.4+)

Înlocuiește stocarea sesiunilor cu funcții proprii, de exemplu pentru a le salva în baza de date.

Sintaxă
session_set_save_handler($open, $close, callable $read, callable $write, callable $destroy, callable $gc, ?callable $create_sid = null, ?callable $validate_sid = null, ?callable $update_timestamp = null): bool

Ce face session_set_save_handler

Forma recomandată primește un obiect care implementează interfața SessionHandlerInterface, cu metodele open, close, read, write, destroy și gc. PHP le apelează automat: read la session_start(), write la finalul scriptului sau la session_write_close().

Așa poți ține sesiunile într-o tabelă MySQL, partajată de mai multe servere. Forma veche, cu șase funcții separate, este învechită din PHP 8.4. Handler-ul se setează înainte de session_start().

Parametri

Parametru Descriere
$open (sau obiectul) Un obiect SessionHandlerInterface (recomandat) sau, în forma veche, funcția de deschidere.
$close, $read, $write, $destroy, $gc În forma veche: funcțiile pentru fiecare operație.
$create_sid, $validate_sid, $update_timestamp Opțional, în forma veche.

Ce returnează

true la succes, false la eroare.

Exemple

Exemplul 1: Handler propriu, cu jurnal al apelurilor

Handler-ul salvează sesiunea în fișiere proprii. Pentru MySQL, metodele fac SELECT, REPLACE și DELETE pe o tabelă.

<?php
class SesiuniProprii implements SessionHandlerInterface
{
    public array $jurnal = [];

    public function open(string $cale, string $nume): bool { return true; }
    public function close(): bool { return true; }

    public function read(string $id): string|false
    {
        $this->jurnal[] = "read($id)";
        return is_file("sesiune_$id.txt") ? file_get_contents("sesiune_$id.txt") : "";
    }

    public function write(string $id, string $date): bool
    {
        $this->jurnal[] = "write($id)";
        return file_put_contents("sesiune_$id.txt", $date) !== false;
    }

    public function destroy(string $id): bool
    {
        @unlink("sesiune_$id.txt");
        return true;
    }

    public function gc(int $durata): int|false { return 0; }
}

$handler = new SesiuniProprii();
session_set_save_handler($handler);
session_id("abc123");
session_start();
$_SESSION["utilizator"] = "ana";
session_write_close();

print_r($handler->jurnal);
echo file_get_contents("sesiune_abc123.txt");

Rezultat

Array
(
    [0] => read(abc123)
    [1] => write(abc123)
)
utilizator|s:3:"ana";

Greșeli frecvente

  • Apelezi session_set_save_handler după session_start() sau după ce ai afișat ceva. Handler-ul nu mai poate fi schimbat.
  • Metoda read returnează false pentru o sesiune nouă. Trebuie să returneze text gol; false înseamnă eroare și sesiunea nu pornește.

Comenzi înrudite

  • session_start: Pornește sau reia sesiunea vizitatorului, ca să poți păstra date între pagini în $_SESSION.
  • session_write_close / session_commit: Salvează datele sesiunii și o închide, ca alte cereri ale aceluiași vizitator să nu mai aștepte după ea.
  • session_register_shutdown: Înregistrează salvarea și închiderea sesiunii (session_write_close) ca funcție rulată la finalul scriptului.
  • session_module_name: Returnează sau schimbă modulul care stochează sesiunile (implicit files; altele: redis, memcached).