L'interface SessionHandlerInterface

(PHP 5 >= 5.4.0, PHP 7)

Introduction

SessionHandlerInterface est une interface qui définit un prototype pour la création d'un gestionnaire de session personnalisé. Afin de passer un gestionnaire de session personnalisé à la fonction session_set_save_handler() en utilisant son invocation OOP, la classe doit implémenter cette interface.

Notez que ces méthodes sont destinées à être appelées de manière interne par PHP, et non depuis l'espace utilisateur.

Synopsis de la classe

SessionHandlerInterface {
/* Méthodes */
abstract public close ( void ) : bool
abstract public destroy ( string $session_id ) : bool
abstract public gc ( int $maxlifetime ) : int
abstract public open ( string $save_path , string $session_name ) : bool
abstract public read ( string $session_id ) : string
abstract public write ( string $session_id , string $session_data ) : bool
}

Exemple #1 Exemple avec SessionHandlerInterface

L'exemple qui suit propose un gestionnaire de stockage de sessions basé sur des fichiers, basiquement comme les sessions PHP fonctionnent en interne de manière native, avec le gestionnaire embarqué files. Cet exemple pourrait être transformé facilement pour utiliser une base de données.

Nous utilisons le style orienté objet avec session_set_save_handler() et nous enregistrons la fonction de fermeture grâce au paramètre de la fonction. C'est en général conseillé lorsque le gestionnaire de session est basé sur des objets.

Attention

Pour plus de brièveté, cet exemple omet la validation d'entrée. Toutefois, les paramètres $id sont en fait des valeurs fournies par l'utilisateur qui nécessitent une validation/assainissement appropriée pour éviter les vulnérabilités, telles que les problèmes de parcours de chemin. N'utilisez donc pas cet exemple sans modification dans les environnements de production.

<?php
class MySessionHandler implements SessionHandlerInterface
{
    private 
$savePath;

    public function 
open($savePath$sessionName)
    {
        
$this->savePath $savePath;
        if (!
is_dir($this->savePath)) {
            
mkdir($this->savePath0777);
        }

        return 
true;
    }

    public function 
close()
    {
        return 
true;
    }

    public function 
read($id)
    {
        return (string)@
file_get_contents("$this->savePath/sess_$id");
    }

    public function 
write($id$data)
    {
        return 
file_put_contents("$this->savePath/sess_$id"$data) === false false true;
    }

    public function 
destroy($id)
    {
        
$file "$this->savePath/sess_$id";
        if (
file_exists($file)) {
            
unlink($file);
        }

        return 
true;
    }

    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($handlertrue);
session_start();

// enregistre/récupère des données avec $_SESSION

Sommaire