Sessions
La classe Sessions réecrie le gestionnaire de sessions de PHP pour qu' il utilise une base de donnée pour le stockage des informations, à la place du sytème de fichiers utilisé par défaut.
Cette classe dispose également d' autres options, notemment la possibilité d' utiliser un Garbage Collector propre à la classe, ce qui permet de le configurer à votre convenance sans retoucher au php.ini ou encore la possibilité de sauvegarder une session (un environnement) pour une durée plus longue et configurable.
Les Méthodes
- Sessions - Nouvelle Instance
- Load_my_GC; - Charger le Garbage Collector de la classe
- Set_my_GC_probability; - Fixer la fréquence d' appel du Garbage Collector
- Save_environnement; - Sauvegarder une session
- Unset_environnement; - Passer une session sauvegardée en mode Normal (non sauvegardée)
- Is_environnement; - Verifier la presence d' une session dans la base de donnée
Exemples
La Source
<?php
/*
CREATE TABLE sessions (
SESS_ID varchar(32) not null,
expire int(11) unsigned not null,
value text not null,
save int (1) unsigned not null,
PRIMARY KEY (SESS_ID),
KEY (expire),
key (save)
);
*/
// définir une des classes d abstraction (MySQL , PGSQL , SQLite) ou DBfactrory (PHP 5)
class Sessions extends mysql {
// Infos de Connection a la base de donnée
var $Server = 'localhost';
var $User = 'root';
var $Password = '';
var $Base = 'test';
var $Table = 'sessions';
// Utilisation du Garbage Collector de PHP
// ou celui de la classe
// Utile si vous n avez pas acces au php.ini
// 0 : utilise le GC de PHP
// 1 : utilise le GC de la classe (configurable)
var $Use_my_GC = 0;
// Pourcentage par defaut d appel du GC
var $GC_probability = 20;
// private
var $Expire;
var $Expire_max;
var $RGC_probability;
var $SESS_ID = '';
var $Save = 0;
function Sessions($expire=3600, $expiremax=360000) {
$this->Expire = time() + (int)$expire;
$this->Expire_max = time() - (int)$expiremax;
$this->Set_my_GC_probability($this->GC_probability);
if(!$this->connect($this->Server, $this->User, $this->Password, $this->Base))
die($this->return_error());
session_set_save_handler(
array(&$this, 's_open'),
array(&$this, 's_close'),
array(&$this, 's_read'),
array(&$this, 's_write'),
array(&$this, 's_destroy'),
array(&$this, 's_gc')
);
}
function Load_my_GC() {
$this->Use_my_GC = 1;
}
function Set_my_GC_probability($percent) {
if($percent<1 || $percent > 100)
return false;
if(!@ini_set('session.gc_probability', $percent))
$this->Use_my_GC = 1;
$this->RGC_probability = (int)(100/$percent);
return true;
}
function Save_environnement($s_id, $expire=false) {
if($expire) {
@setcookie('SESS_ID', $s_id, time()+$expire, '/');
$Q = "
UPDATE $this->Table
SET expire = " . (time() + (int)$expire) . "
WHERE SESS_ID = '$s_id' ";
}
else {
@setcookie('SESS_ID', $s_id, time()+$this->Expire_max, '/');
$Q = "
UPDATE $this->Table
SET save = 1
WHERE SESS_ID = '$s_id' ";
}
return $this->Send_Query($Q);
}
function Unset_environnement($sid) {
$Q = "
UPDATE $this->Table
SET save = 0
WHERE SESS_ID = '$s_id' ";
return $this->Send_Query($Q);
}
function Is_environnement($s_id) {
$Q = "
SELECT 1 FROM $this->Table
WHERE SESS_ID = '$s_id' ";
$a = $this->num_rows($this->Send_Query($Q));
return $a;
}
// ------------------------------------------------ //
// PRIVATE METHODS //
// ------------------------------------------------ //
function s_open($s_path, $s_name) {
//return false;
if($this->Use_my_GC)
{$this->My_GC();}
return true;
}
function s_close() {
//$this->close($this->Link);
return true;
}
function s_read($s_id) {
$Q = "
SELECT value, save
FROM $this->Table
WHERE SESS_ID = '$s_id' ";
$T = $this->get_array($this->Send_Query($Q));
return (string)$this->_stripslashes($T['value']);
}
function s_write($s_id, $value) {
$Q = "
INSERT INTO $this->Table
VALUES('$s_id', $this->Expire , '".$this->_addslashes($value)."', $this->Save) ";
if(!$this->Send_Query($Q)) {
$Q = "
UPDATE $this->Table
SET expire = $this->Expire, value = '".$this->_addslashes($value)."'
WHERE SESS_ID = '$s_id' ";
return $this->Send_Query($Q);
}
return true;
}
function s_destroy($s_id) {
$Q = "
DELETE FROM $this->Table
WHERE SESS_ID = '$s_id' ";
return $this->Send_Query($Q);
}
function s_gc($maxlifetime) {
if(!$this->Use_my_GC) {
//echo 'GC';
return $this->GC();
}
else
return true;
}
function _addslashes($value) {
return get_magic_quotes_gpc() ? $value : addslashes($value) ;
}
function _stripslashes($value) {
return get_magic_quotes_runtime() ? $value : stripslashes($value);
}
function GC() {
$Q = "
DELETE FROM $this->Table
WHERE expire < " . time() ." AND save = 0 ";
//echo 'GC';
return $this->Send_Query($Q);
}
function My_GC() {
srand((double)microtime()*1000000);
if(1 === rand(1, (int)$this->RGC_probability))
return $this->GC();
else
return true;
}
}// end class
?>
/*
CREATE TABLE sessions (
SESS_ID varchar(32) not null,
expire int(11) unsigned not null,
value text not null,
save int (1) unsigned not null,
PRIMARY KEY (SESS_ID),
KEY (expire),
key (save)
);
*/
// définir une des classes d abstraction (MySQL , PGSQL , SQLite) ou DBfactrory (PHP 5)
class Sessions extends mysql {
// Infos de Connection a la base de donnée
var $Server = 'localhost';
var $User = 'root';
var $Password = '';
var $Base = 'test';
var $Table = 'sessions';
// Utilisation du Garbage Collector de PHP
// ou celui de la classe
// Utile si vous n avez pas acces au php.ini
// 0 : utilise le GC de PHP
// 1 : utilise le GC de la classe (configurable)
var $Use_my_GC = 0;
// Pourcentage par defaut d appel du GC
var $GC_probability = 20;
// private
var $Expire;
var $Expire_max;
var $RGC_probability;
var $SESS_ID = '';
var $Save = 0;
function Sessions($expire=3600, $expiremax=360000) {
$this->Expire = time() + (int)$expire;
$this->Expire_max = time() - (int)$expiremax;
$this->Set_my_GC_probability($this->GC_probability);
if(!$this->connect($this->Server, $this->User, $this->Password, $this->Base))
die($this->return_error());
session_set_save_handler(
array(&$this, 's_open'),
array(&$this, 's_close'),
array(&$this, 's_read'),
array(&$this, 's_write'),
array(&$this, 's_destroy'),
array(&$this, 's_gc')
);
}
function Load_my_GC() {
$this->Use_my_GC = 1;
}
function Set_my_GC_probability($percent) {
if($percent<1 || $percent > 100)
return false;
if(!@ini_set('session.gc_probability', $percent))
$this->Use_my_GC = 1;
$this->RGC_probability = (int)(100/$percent);
return true;
}
function Save_environnement($s_id, $expire=false) {
if($expire) {
@setcookie('SESS_ID', $s_id, time()+$expire, '/');
$Q = "
UPDATE $this->Table
SET expire = " . (time() + (int)$expire) . "
WHERE SESS_ID = '$s_id' ";
}
else {
@setcookie('SESS_ID', $s_id, time()+$this->Expire_max, '/');
$Q = "
UPDATE $this->Table
SET save = 1
WHERE SESS_ID = '$s_id' ";
}
return $this->Send_Query($Q);
}
function Unset_environnement($sid) {
$Q = "
UPDATE $this->Table
SET save = 0
WHERE SESS_ID = '$s_id' ";
return $this->Send_Query($Q);
}
function Is_environnement($s_id) {
$Q = "
SELECT 1 FROM $this->Table
WHERE SESS_ID = '$s_id' ";
$a = $this->num_rows($this->Send_Query($Q));
return $a;
}
// ------------------------------------------------ //
// PRIVATE METHODS //
// ------------------------------------------------ //
function s_open($s_path, $s_name) {
//return false;
if($this->Use_my_GC)
{$this->My_GC();}
return true;
}
function s_close() {
//$this->close($this->Link);
return true;
}
function s_read($s_id) {
$Q = "
SELECT value, save
FROM $this->Table
WHERE SESS_ID = '$s_id' ";
$T = $this->get_array($this->Send_Query($Q));
return (string)$this->_stripslashes($T['value']);
}
function s_write($s_id, $value) {
$Q = "
INSERT INTO $this->Table
VALUES('$s_id', $this->Expire , '".$this->_addslashes($value)."', $this->Save) ";
if(!$this->Send_Query($Q)) {
$Q = "
UPDATE $this->Table
SET expire = $this->Expire, value = '".$this->_addslashes($value)."'
WHERE SESS_ID = '$s_id' ";
return $this->Send_Query($Q);
}
return true;
}
function s_destroy($s_id) {
$Q = "
DELETE FROM $this->Table
WHERE SESS_ID = '$s_id' ";
return $this->Send_Query($Q);
}
function s_gc($maxlifetime) {
if(!$this->Use_my_GC) {
//echo 'GC';
return $this->GC();
}
else
return true;
}
function _addslashes($value) {
return get_magic_quotes_gpc() ? $value : addslashes($value) ;
}
function _stripslashes($value) {
return get_magic_quotes_runtime() ? $value : stripslashes($value);
}
function GC() {
$Q = "
DELETE FROM $this->Table
WHERE expire < " . time() ." AND save = 0 ";
//echo 'GC';
return $this->Send_Query($Q);
}
function My_GC() {
srand((double)microtime()*1000000);
if(1 === rand(1, (int)$this->RGC_probability))
return $this->GC();
else
return true;
}
}// end class
?>