krillsession
La classe krillsession fournit une alternative à la solution de session integrée à php.
nc.
Les Méthodes
- SESSION - Nouvelle Instance
- create - Créer une nouvelle session
- register - enregistrer une nouvelle variable de session
- unregister - Détruit la variable qui a pour nom var de la session courante.
- unregister_all - Détruit toutes les variables de la session courante.
- is_registered - Indique si la variable est enregistrée.
- destroy - Détruit la session courante.
Exemples
La Source
<?php
############################################ Présentation ################################################
# Nom de la classe : SESSION #
# Version : 1.0 (dernière modification le 18/07/2003) #
# Description : Classe permettant de gérer les session en PHP. #
# Compatibilité : PHP 4.1.0 et plus. #
# Auteur : Krill (guillaume.delbar@worldonline.fr). #
# Copyright : License GPL #
##########################################################################################################
class SESSION
{
####################################################################################################
# Propriétés statiques à configurer #
####################################################################################################
//Répertoire de sauvegarde des fichiers de session (ne doit pas être accessible depuis le web !!)
var $save_path = "C:\\tmp";
//Taille limite (en Ko) de l'ensemble des fichiers de session au delà de laquelle on épure les
//fichiers de session obsolètes.
var $max_save_path_size = 10;
//Temps maximum (en mn) d'inactivité entre 2 accès
var $inactivity_timeout = 120;
//Temps maximum (en mn) disponible pour une session
var $global_timeout = 720;
//Nom de l'identifiant de session
var $id_name = "SESS_ID";
//Spécifie si le cookie enregistré chez le client est un cookie de session (non permanent) ou un
//cookie permanent (d'une durée de vie égale à $global_timeout).
var $is_session_cookie = true;
####################################################################################################
# Propriétés à utiliser dans vos scripts #
####################################################################################################
//Tableau contenant toutes les variables de session de l'utilisateur. Toutes les manipulations de
//variables (ajout, suppression, modification) peuvent se faire via ce tableau
var $value;
//Identifiant de session. A noter que modifier la valeur de cette propriété n'a aucun impact sur
//la valeur réelle de l'identifiant de session.
var $id;
####################################################################################################
# Propriétés privées gérées par la classe #
####################################################################################################
var $timeout_array; // Tableau contenant les variables de timeout
var $save_path_size; // Taille du répertoire des fichiers de session
var $is_save; // Spécifie si on doit sauvegarder la session à la fin du script
####################################################################################################
# Méthodes publics à utiliser directement #
####################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void SESSION(void)
// Description : constructeur de la classe : initialise les propriétés gérées par la classe,
// nettoie éventuellement le répertoire des fichiers de session et initialise
// la session via la méthode start. A l'issue de l'instanciation, la constante
// SESSION_STATUT est initialisée et peut prendre les valeurs suivantes :
//
// -> ACTIVE : l'utilisateur a une session active sur le serveur
// -> NONE : l'utilisateur n'a pas de session active sur le serveur
// -> NONE_ID_ERR : l'utilisateur n'a pas de session active sur le serveur
// et a envoyé un identifiant de session non valide
// (tentative de piratage ??)
// -> NONE_FILE_ERR : l'utilisateur n'a plus de session active sur le serveur
// car il n'y a plus de fichier de session
// -> NONE_TIMEOUT_ERR : l'utilisateur n'a plus de session active sur le serveur
// car sa session a expiré
//
// A noter que dans le cas de NONE_ID_ERR, NONE_FILE_ERR et NONE_TIMEOUT_ERR, on ne
// pas recréer de session dans le script courant (à cause du cookie).
// Remarque : L'appel à une nouvelle instance de la classe doit se faire par référence
// pour permettre la sauvegarde des modifications dans $this->value en fin de script.
////////////////////////////////////////////////////////////////////////////////////////////////////
function SESSION()
{
//Initialisation de $this->timeout_array et $this->is_save
$this->timeout_array = array();
$this->is_save = false;
//Initilisation de $this->save_path_size
$this->save_path_size = $this->dir_size();
//Nettoyage éventuel du répertoire des fichiers de session
if($this->save_path_size > $this->max_save_path_size)
{
$this->clean_dir();
}
//Démarrage de la session (initialisation de $this->value et $this->id)
$this->start();
//Enregistre automatiquement les modifications dans $this->value à la fin du script
register_shutdown_function(array(&$this, 'save'));
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void create(void)
// Description : Crée une nouvelle session. Si une session existe déjà, cette méthode sera
// sans effet.
// Remarque : -
//////////////////////////////////////////////////////////////////////////////////////////////
function create()
{
if(SESSION_STATUT == "NONE")
{
$this->id = md5(uniqid(rand()));
if($this->is_session_cookie)
{
setcookie($this->id_name, $this->id);
}
else
{
setcookie($this->id_name, $this->id, time()+$this->global_timeout*60);
}
$this->value = array();
$this->timeout_array["SESSION_FIRST_ACCESSED"] = time();
$this->timeout_array["SESSION_LAST_ACCESSED"] = time();
$this->is_save = true;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : boolean register(string name_var [, mixed content_var])
// Description : Enregistre la variable qui a pour nom name_var dans la session courante.
// Si content_var n'est pas précisé, la variable contiendra le contenu de la
// variable globale name_var, sinon le contenu de content_var.
// Remarque : équivalent à : $this->value[$name_var] = $content_var;
//////////////////////////////////////////////////////////////////////////////////////////////
function register($name_var, $content_var="")
{
if(func_num_args() == 1 and isset($GLOBALS[$name_var]))
{
$this->value[$name_var] = $GLOBALS[$name_var];
return true;
}
elseif(func_num_args() == 2)
{
$this->value[$name_var] = $content_var;
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void unregister(string name_var)
// Description : Détruit la variable qui a pour nom var de la session courante.
// Remarque : équivalent à : unset($this->value[$name_var]);
//////////////////////////////////////////////////////////////////////////////////////////////
function unregister($name_var)
{
unset($this->value[$name_var]);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void unregister_all(void)
// Description : Détruit toutes les variables de la session courante.
// Remarque : équivalent à : unset($this->value);
//////////////////////////////////////////////////////////////////////////////////////////////
function unregister_all()
{
unset($this->value);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : boolean is_registered(string var)
// Description : Indique si la variable qui a pour nom var est enregistrée dans la session
// courante
// Remarque : équivalent à : isset($this->value[$var]);
//////////////////////////////////////////////////////////////////////////////////////////////
function is_registered($var)
{
return isset($this->value[$var]);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void destroy(void)
// Description : Détruit la session courante (variables, fichier de session et cookie). La
// destruction prend effet immédiatement en ce qui concerne les variables et le
// fichier de session, la valeur du cookie étant encore disponible jusqu'à la
// fin du script.
// Remarque : -
//////////////////////////////////////////////////////////////////////////////////////////////
function destroy()
{
clearstatcache();
if(file_exists($this->save_path."/session_".$this->id))
{
unlink($this->save_path."/session_".$this->id);
}
unset($this->value);
if(isset($_COOKIE[$this->id_name]))
{
setcookie($this->id_name, "");
}
$this->is_save = false;
}
####################################################################################################
# Méthodes privées utilisées par la classe #
####################################################################################################
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void start(void)
// Description : Crée, poursuit ou détruit la session courante en fonction du contexte
// Remarque : A ne pas utiliser, méthode privée
//////////////////////////////////////////////////////////////////////////////////////////////
function start()
{
//Si aucun identifiant n'a été envoyé, on quitte
if(!isset($_COOKIE[$this->id_name]))
{
define("SESSION_STATUT", "NONE");
return;
}
//Sinon on initialise $this->id
else
{
$this->id = $_COOKIE[$this->id_name];
}
//Test sur le format de l'identifiant de session
if(strlen($this->id) != 32 or !ereg("[a-z0-9]{32}",$this->id))
{
$this->destroy();
define("SESSION_STATUT", "NONE_ID_ERR");
return;
}
//Test de l'existence du fichier de session
clearstatcache();
if(!file_exists($this->save_path."/session_".$this->id))
{
$this->destroy();
define("SESSION_STATUT", "NONE_FILE_ERR");
return;
}
//On récupère les variables de session
clearstatcache();
$fp = fopen($this->save_path."/session_".$this->id,"r");
$this->value = unserialize(fread($fp,filesize($this->save_path."/session_".$this->id)));
fclose($fp);
//Test des timeout
if((time() - $this->inactivity_timeout*60) > $this->value["SESSION_LAST_ACCESSED"] or (time() - $this->global_timeout*60) > $this->value["SESSION_FIRST_ACCESSED"])
{
$this->destroy();
define("SESSION_STATUT", "NONE_TIMEOUT_ERR");
return;
}
//Enregistrement des timeout dans $timeout_array
$this->timeout_array["SESSION_FIRST_ACCESSED"] = $this->value["SESSION_FIRST_ACCESSED"];
$this->timeout_array["SESSION_LAST_ACCESSED"] = time();
//Définition du statut de la session
define("SESSION_STATUT", "ACTIVE");
$this->is_save = true;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void save(void)
// Description : Enregistre les modifications effectuée dans le tableau $this->value
// Remarque : A ne pas utiliser, méthode privée
//////////////////////////////////////////////////////////////////////////////////////////////
function save()
{
if($this->is_save)
{
$this->value["SESSION_LAST_ACCESSED"] = $this->timeout_array["SESSION_LAST_ACCESSED"];
$this->value["SESSION_FIRST_ACCESSED"] = $this->timeout_array["SESSION_FIRST_ACCESSED"];
$fp = fopen($this->save_path."/session_".$this->id, "w");
fwrite($fp, serialize($this->value));
fclose($fp);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : float dir_size(void)
// Description : Renvoie la taille de l'ensemble des fichiers de session
// Remarque : A ne pas utiliser, méthode privée
//////////////////////////////////////////////////////////////////////////////////////////////
function dir_size()
{
$dp = opendir($this->save_path);
$size = 0;
while($file = readdir($dp))
{
if($file != "." and $file != ".." and ereg("^session_",$file))
{
clearstatcache();
$size += filesize($this->save_path."/".$file);
}
}
closedir($dp);
return round($size/1024,2);
}
////////////////////////////////////////////////////////////////////////////////////////
// Nom : void clean_dir(void)
// Description : Supprime les fichiers de session obsolètes
// Remarque : A ne pas utiliser, méthode privée
////////////////////////////////////////////////////////////////////////////////////////
function clean_dir()
{
$dp = opendir($this->save_path);
while($file = readdir($dp))
{
if($file != "." and $file != ".." and ereg("^session_",$file))
{
clearstatcache();
$fp = fopen($this->save_path."/".$file,"r");
$content_array = unserialize(fread($fp,filesize($this->save_path."/".$file)));
fclose($fp);
if((time() - $this->inactivity_timeout*60) > $content_array["SESSION_LAST_ACCESSED"] or (time() - $this->global_timeout*60) > $content_array["SESSION_FIRST_ACCESSED"])
{
unlink($this->save_path."/".$file);
}
}
}
closedir($dp);
}
}
?>
############################################ Présentation ################################################
# Nom de la classe : SESSION #
# Version : 1.0 (dernière modification le 18/07/2003) #
# Description : Classe permettant de gérer les session en PHP. #
# Compatibilité : PHP 4.1.0 et plus. #
# Auteur : Krill (guillaume.delbar@worldonline.fr). #
# Copyright : License GPL #
##########################################################################################################
class SESSION
{
####################################################################################################
# Propriétés statiques à configurer #
####################################################################################################
//Répertoire de sauvegarde des fichiers de session (ne doit pas être accessible depuis le web !!)
var $save_path = "C:\\tmp";
//Taille limite (en Ko) de l'ensemble des fichiers de session au delà de laquelle on épure les
//fichiers de session obsolètes.
var $max_save_path_size = 10;
//Temps maximum (en mn) d'inactivité entre 2 accès
var $inactivity_timeout = 120;
//Temps maximum (en mn) disponible pour une session
var $global_timeout = 720;
//Nom de l'identifiant de session
var $id_name = "SESS_ID";
//Spécifie si le cookie enregistré chez le client est un cookie de session (non permanent) ou un
//cookie permanent (d'une durée de vie égale à $global_timeout).
var $is_session_cookie = true;
####################################################################################################
# Propriétés à utiliser dans vos scripts #
####################################################################################################
//Tableau contenant toutes les variables de session de l'utilisateur. Toutes les manipulations de
//variables (ajout, suppression, modification) peuvent se faire via ce tableau
var $value;
//Identifiant de session. A noter que modifier la valeur de cette propriété n'a aucun impact sur
//la valeur réelle de l'identifiant de session.
var $id;
####################################################################################################
# Propriétés privées gérées par la classe #
####################################################################################################
var $timeout_array; // Tableau contenant les variables de timeout
var $save_path_size; // Taille du répertoire des fichiers de session
var $is_save; // Spécifie si on doit sauvegarder la session à la fin du script
####################################################################################################
# Méthodes publics à utiliser directement #
####################################################################################################
////////////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void SESSION(void)
// Description : constructeur de la classe : initialise les propriétés gérées par la classe,
// nettoie éventuellement le répertoire des fichiers de session et initialise
// la session via la méthode start. A l'issue de l'instanciation, la constante
// SESSION_STATUT est initialisée et peut prendre les valeurs suivantes :
//
// -> ACTIVE : l'utilisateur a une session active sur le serveur
// -> NONE : l'utilisateur n'a pas de session active sur le serveur
// -> NONE_ID_ERR : l'utilisateur n'a pas de session active sur le serveur
// et a envoyé un identifiant de session non valide
// (tentative de piratage ??)
// -> NONE_FILE_ERR : l'utilisateur n'a plus de session active sur le serveur
// car il n'y a plus de fichier de session
// -> NONE_TIMEOUT_ERR : l'utilisateur n'a plus de session active sur le serveur
// car sa session a expiré
//
// A noter que dans le cas de NONE_ID_ERR, NONE_FILE_ERR et NONE_TIMEOUT_ERR, on ne
// pas recréer de session dans le script courant (à cause du cookie).
// Remarque : L'appel à une nouvelle instance de la classe doit se faire par référence
// pour permettre la sauvegarde des modifications dans $this->value en fin de script.
////////////////////////////////////////////////////////////////////////////////////////////////////
function SESSION()
{
//Initialisation de $this->timeout_array et $this->is_save
$this->timeout_array = array();
$this->is_save = false;
//Initilisation de $this->save_path_size
$this->save_path_size = $this->dir_size();
//Nettoyage éventuel du répertoire des fichiers de session
if($this->save_path_size > $this->max_save_path_size)
{
$this->clean_dir();
}
//Démarrage de la session (initialisation de $this->value et $this->id)
$this->start();
//Enregistre automatiquement les modifications dans $this->value à la fin du script
register_shutdown_function(array(&$this, 'save'));
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void create(void)
// Description : Crée une nouvelle session. Si une session existe déjà, cette méthode sera
// sans effet.
// Remarque : -
//////////////////////////////////////////////////////////////////////////////////////////////
function create()
{
if(SESSION_STATUT == "NONE")
{
$this->id = md5(uniqid(rand()));
if($this->is_session_cookie)
{
setcookie($this->id_name, $this->id);
}
else
{
setcookie($this->id_name, $this->id, time()+$this->global_timeout*60);
}
$this->value = array();
$this->timeout_array["SESSION_FIRST_ACCESSED"] = time();
$this->timeout_array["SESSION_LAST_ACCESSED"] = time();
$this->is_save = true;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : boolean register(string name_var [, mixed content_var])
// Description : Enregistre la variable qui a pour nom name_var dans la session courante.
// Si content_var n'est pas précisé, la variable contiendra le contenu de la
// variable globale name_var, sinon le contenu de content_var.
// Remarque : équivalent à : $this->value[$name_var] = $content_var;
//////////////////////////////////////////////////////////////////////////////////////////////
function register($name_var, $content_var="")
{
if(func_num_args() == 1 and isset($GLOBALS[$name_var]))
{
$this->value[$name_var] = $GLOBALS[$name_var];
return true;
}
elseif(func_num_args() == 2)
{
$this->value[$name_var] = $content_var;
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void unregister(string name_var)
// Description : Détruit la variable qui a pour nom var de la session courante.
// Remarque : équivalent à : unset($this->value[$name_var]);
//////////////////////////////////////////////////////////////////////////////////////////////
function unregister($name_var)
{
unset($this->value[$name_var]);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void unregister_all(void)
// Description : Détruit toutes les variables de la session courante.
// Remarque : équivalent à : unset($this->value);
//////////////////////////////////////////////////////////////////////////////////////////////
function unregister_all()
{
unset($this->value);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : boolean is_registered(string var)
// Description : Indique si la variable qui a pour nom var est enregistrée dans la session
// courante
// Remarque : équivalent à : isset($this->value[$var]);
//////////////////////////////////////////////////////////////////////////////////////////////
function is_registered($var)
{
return isset($this->value[$var]);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void destroy(void)
// Description : Détruit la session courante (variables, fichier de session et cookie). La
// destruction prend effet immédiatement en ce qui concerne les variables et le
// fichier de session, la valeur du cookie étant encore disponible jusqu'à la
// fin du script.
// Remarque : -
//////////////////////////////////////////////////////////////////////////////////////////////
function destroy()
{
clearstatcache();
if(file_exists($this->save_path."/session_".$this->id))
{
unlink($this->save_path."/session_".$this->id);
}
unset($this->value);
if(isset($_COOKIE[$this->id_name]))
{
setcookie($this->id_name, "");
}
$this->is_save = false;
}
####################################################################################################
# Méthodes privées utilisées par la classe #
####################################################################################################
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void start(void)
// Description : Crée, poursuit ou détruit la session courante en fonction du contexte
// Remarque : A ne pas utiliser, méthode privée
//////////////////////////////////////////////////////////////////////////////////////////////
function start()
{
//Si aucun identifiant n'a été envoyé, on quitte
if(!isset($_COOKIE[$this->id_name]))
{
define("SESSION_STATUT", "NONE");
return;
}
//Sinon on initialise $this->id
else
{
$this->id = $_COOKIE[$this->id_name];
}
//Test sur le format de l'identifiant de session
if(strlen($this->id) != 32 or !ereg("[a-z0-9]{32}",$this->id))
{
$this->destroy();
define("SESSION_STATUT", "NONE_ID_ERR");
return;
}
//Test de l'existence du fichier de session
clearstatcache();
if(!file_exists($this->save_path."/session_".$this->id))
{
$this->destroy();
define("SESSION_STATUT", "NONE_FILE_ERR");
return;
}
//On récupère les variables de session
clearstatcache();
$fp = fopen($this->save_path."/session_".$this->id,"r");
$this->value = unserialize(fread($fp,filesize($this->save_path."/session_".$this->id)));
fclose($fp);
//Test des timeout
if((time() - $this->inactivity_timeout*60) > $this->value["SESSION_LAST_ACCESSED"] or (time() - $this->global_timeout*60) > $this->value["SESSION_FIRST_ACCESSED"])
{
$this->destroy();
define("SESSION_STATUT", "NONE_TIMEOUT_ERR");
return;
}
//Enregistrement des timeout dans $timeout_array
$this->timeout_array["SESSION_FIRST_ACCESSED"] = $this->value["SESSION_FIRST_ACCESSED"];
$this->timeout_array["SESSION_LAST_ACCESSED"] = time();
//Définition du statut de la session
define("SESSION_STATUT", "ACTIVE");
$this->is_save = true;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : void save(void)
// Description : Enregistre les modifications effectuée dans le tableau $this->value
// Remarque : A ne pas utiliser, méthode privée
//////////////////////////////////////////////////////////////////////////////////////////////
function save()
{
if($this->is_save)
{
$this->value["SESSION_LAST_ACCESSED"] = $this->timeout_array["SESSION_LAST_ACCESSED"];
$this->value["SESSION_FIRST_ACCESSED"] = $this->timeout_array["SESSION_FIRST_ACCESSED"];
$fp = fopen($this->save_path."/session_".$this->id, "w");
fwrite($fp, serialize($this->value));
fclose($fp);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
// Nom : float dir_size(void)
// Description : Renvoie la taille de l'ensemble des fichiers de session
// Remarque : A ne pas utiliser, méthode privée
//////////////////////////////////////////////////////////////////////////////////////////////
function dir_size()
{
$dp = opendir($this->save_path);
$size = 0;
while($file = readdir($dp))
{
if($file != "." and $file != ".." and ereg("^session_",$file))
{
clearstatcache();
$size += filesize($this->save_path."/".$file);
}
}
closedir($dp);
return round($size/1024,2);
}
////////////////////////////////////////////////////////////////////////////////////////
// Nom : void clean_dir(void)
// Description : Supprime les fichiers de session obsolètes
// Remarque : A ne pas utiliser, méthode privée
////////////////////////////////////////////////////////////////////////////////////////
function clean_dir()
{
$dp = opendir($this->save_path);
while($file = readdir($dp))
{
if($file != "." and $file != ".." and ereg("^session_",$file))
{
clearstatcache();
$fp = fopen($this->save_path."/".$file,"r");
$content_array = unserialize(fread($fp,filesize($this->save_path."/".$file)));
fclose($fp);
if((time() - $this->inactivity_timeout*60) > $content_array["SESSION_LAST_ACCESSED"] or (time() - $this->global_timeout*60) > $content_array["SESSION_FIRST_ACCESSED"])
{
unlink($this->save_path."/".$file);
}
}
}
closedir($dp);
}
}
?>