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 bool close ( void )
abstract public bool destroy ( string $session_id )
abstract public bool gc ( int $maxlifetime )
abstract public bool open ( string $save_path , string $name )
abstract public string read ( string $session_id )
abstract public bool write ( string $session_id , string $session_data )
}

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.

<?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

add a note add a note

User Contributed Notes 6 notes

up
3
warxcell at gmail dot com
5 years ago
You should prepend <b>\</b> before class name, to tell php its from root namespace.
up
1
avenidagez at foro5 dot com
3 years ago
Note that session_start( ) calls open then read and the class returns true for open and the value of session or empty for read.
Well, then there is no catch for errors, this is, session_start() must return false on failure, but that is not the case for the class implementation on method open, no matter if you return true or false or whatever from open, it is ignored by session_start() function and proceeds to read method
A bug?, if open returns false, session_start() should stop the next step (read) and return itself false

if(session_start()) ...code
else exit( );

So forget about session_start() return value, you need to implement an error catch routine and exit() in case of failure on open method
up
1
ohcc at 163 dot com
1 day ago
As of PHP 7.0, you can implement SessionUpdateTimestampHandlerInterface to
define your own session id validating method like validate_sid and the timestamp updating method like update_timestamp in the non-OOP prototype of session_set_save_handler().

SessionUpdateTimestampHandlerInterface is a new interface introduced in PHP 7.0, which has not been documented yet. It has two abstract methods: SessionUpdateTimestampHandlerInterface :: validateId($sessionId) and SessionUpdateTimestampHandlerInterface :: updateTimestamp($sessionId, $sessionData).

<?php
   
/*
       @author Wu Xiancheng
       Code structure for PHP 7.0+ only because SessionUpdateTimestampHandlerInterface is introduced in PHP 7.0
       With this class you can validate php session id and update the timestamp of php session data
       with the OOP prototype of session_set_save_handler() in PHP 7.0+
    */
   
class PHPSessionXHandler implements SessionHandlerInterface, SessionUpdateTimestampHandlerInterface {
        public function
close(){
           
// return value should be true for success or false for failure
            // ...
       
}
        public function
destroy($sessionId){
           
// return value should be true for success or false for failure
            // ...
       
}
        public function
gc($maximumLifetime){
           
// return value should be true for success or false for failure
            // ...
       
}
        public function
open($sessionSavePath, $sessionName){
           
// return value should be true for success or false for failure
            // ...
       
}
        public function
read($sessionId){
           
// return value should be the session data or an empty string
            // ...
       
}
        public function
write($sessionId, $sessionData){
           
// return value should be true for success or false for failure
            // ...
       
}
        public function
create_sid(){
           
// available since PHP 5.5.1
            // invoked internally when a new session id is needed
            // no parameter is needed and return value should be the new session id created
            // ...
       
}
        public function
validateId($sessionId){
           
// implements SessionUpdateTimestampHandlerInterface::validateId()
            // available since PHP 7.0
            // return value should be true if the session id is valid otherwise false
            // if false is returned a new session id will be generated by php internally
            // ...
       
}
        public function
updateTimestamp($sessionId, $sessionData){
           
// implements SessionUpdateTimestampHandlerInterface::validateId()
            // available since PHP 7.0
            // return value should be true for success or false for failure
            // ...
       
}
    }
?>
up
0
ohcc at 163 dot com
1 day ago
The non-OOP prototype of session_set_save_handler() supports validate_sid and update_timestamp as of PHP 7.0 while the OOP prototype doesn't even in PHP 7.2. However the OOP prototype does support create_sid since PHP 5.5.1.

validate_sid($sessionId)
  This callback is to validate $sessionId. Its return value should be true for valid session id $sessionId or false for invalid session id $sessionId. If false is returned, a new session id is generated to replace the invalid session id $sessionId.

update_timestamp($sessionId)
  This call back is to update timestamp, and its return value should be true for success or false for failure.
up
0
ohcc at 163 dot com
14 days ago
As of PHP 5.5.1, another method create_sid() is supported. It will be called when session_regenerate_id() is invoked.

SessionHandlerInterface {
    /* Methods */
    abstract public bool close ( void )
    abstract public bool create_sid ( void )   
    abstract public bool destroy ( string $session_id )
    abstract public bool gc ( int $maxlifetime )
    abstract public bool open ( string $save_path , string $session_name )
    abstract public string read ( string $session_id )
    abstract public bool write ( string $session_id , string $session_data )
}
up
-1
StanE
2 years ago
I think there is a small "error" in the example of the class MySessionHandler in method gc(). It uses the function filemtime() whose return value is cached by PHP. Add the following line inside the foreach block in the gc() method:

clearstatcache(true, $file);
To Top