Gérer les sessions avec SQLite

ViPHP
ViPHP | 5462 Messages

24 nov. 2010, 02:51

PHP peut gérer les sessions via SQLite, ce qui est très pratique dans un cas de partage de sessions par exemple.
Pour voir si votre serveur accepte cette fonctionnalité RDV dans votre phpinfo section Session -> Registered save handlers, si Sqlite est dans la liste c'est OK :wink:

Les deux façons pour activer SQlite pour les sessions :
La gestion est assez souple on peux modifier ca via les directives ini ou directement via des fonctions

- Version ini :
grâce à session.save_handler et session.save_path
ini_set('session.save_handler', 'sqlite');
ini_set('session.save_path', 'session.db');
Ou direct dans le php.ini ou en .htaccess (dans les cas je conseil de mettre le path en absolue)

- Version php :
grâce à session_module_name et session_save_path
session_module_name('sqlite');
session_save_path('session.db');
On peut bien-sûr mixer les différentes façons

Attention vous devez avoir le droit en écriture sur le dossier.

Un coup de session_start() voila notre session.db, malheureusement c'est du sqlite2 (je demanderais pour la gestion du 3)

Récupérer les sessions :

La base correspond a
CREATE session_data (
    sess_id PRIMARY KEY,
    value TEXT,
    updated INT
)
- sess_id : l'id de session
- value : le contenu de la session
- updated : la date de la dernière mise a jour
(pas très compliquer)

Pour la suite on va utiliser PDO pour lire notre base, comme c'est du sqlite 2 le DNS sera sqlite2
try
{
    $dbh = new PDO('sqlite2:' . session_save_path());
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);		
}
catch(PDOException $e)
{
    exit($e->getMessage());
}
Les données étant brutes dans la base il faudra utiliser session_decode et session_encode pour les manipuler, je vous conseil de bien lire la doc de ces fonctions car elles sont pas simple a utiliser puisque qu'elles écrasent la session en cours.
Modifié en dernier par stealth35 le 03 janv. 2012, 11:14, modifié 3 fois.

ViPHP
ViPHP | 5462 Messages

02 mai 2011, 16:07

Pour ceux que ça intéresse, j'ai crée le module de session pour Sqlite3, vous pouvez le télécharger ici :
https://github.com/downloads/stealth35/ ... c9-x86.zip

Au niveau de l'utilisation c'est pareil :
session_module_name('sqlite3');
$dbh = new PDO('sqlite:' . session_save_path());
:wink:
Modifié en dernier par stealth35 le 03 janv. 2012, 10:40, modifié 1 fois.

ViPHP
ViPHP | 928 Messages

02 mai 2011, 16:25

Salut,
c'est intéressant, mais le point utile que tu mets en avant est le partage. Or il me semble qu'il est possible de partager de base des sessions en PHP non ?

ViPHP
ViPHP | 5462 Messages

02 mai 2011, 16:32

Salut,
c'est intéressant, mais le point utile que tu mets en avant est le partage. Or il me semble qu'il est possible de partager de base des sessions en PHP non ?
en natif c'est possible que comme ça, ou alors faire un check des fichiers sess_* les parser ect
sinon oui on peu faire du partage avec n'importe quelle base en utilise session_set_save_handler, sauf qu'il faut tout implémenté, et la connexion doit être faite avant chaque mise en session

Le plus intéressant serait de partager (toujours nativement) avec d'autres langages, un moyen de simple et de faire un serializer en JSON, ça pourrait se faire dès maintenant mais les classes sérialisées ne marcheraient pas, il faut donc attendre la 5.4 pour l'interface JsonSerializable