ZF2 – utilisation des session – Zend\Session

utilisation des sessions dans ZF2

Dans les application web qu’on développe, on aura très souvent besoin de reconnaitre les utilisateurs à travers leurs différentes requêtes http(s).

pour rappel, le protocole HTTP 1 est stateless (ou sans état), ce qui veut dire qu’à chaque requête utilisateur le serveur est incapable de faire le lien avec les requêtes précédentes. On utilisera donc les sessions (et donc un cookie coté client sera généré) pour faire persister certaines données utiles entre les différentes requêtes (identifiant temporaire de session, dernière page visitée, locale utilisateur, etc…).

on prendra soin de ne pas stocker dans les sessions des informations sensibles ou inappropriées. (le protocole HTTP est en train d’évoluer doucement vers HTTP 2.0 qui apportera probablement des solutions nouvelles à ce problème)

On utilise des namespaces pour différencier ce que l’on stocke dans les sessions (comme dans ZF1). On les manipulera via des “Containers”. (physiquement, l’objet session est un tableau associatif dans lequel on a des namespaces comme clés, et comme contenu pour chaque namespace, un autre tableau associatif. l’ensemble des deux est un “Container”(namespace et son contenu). ( pour me répéter autrement : deux variables portants le même nom et stockées dans différents containers sont indépendantes et donc il n’y a pas de collision entre ces variables).

par ailleurs Zend\Session\Container est un ArrayObject et on peut le manipuler comme tel ( http://php.net/manual/fr/class.arrayobject.php ) pour l’example :

( sous le capot :  $_SESSION['user']['devise‘]  vaut ‘Euro’  et $_SESSION['freelancer']['devise‘]  vaut ‘Euro’ )

Ailleurs dans le code, on peut récupérer une donnée comme ceci (en utilisant les possibilités de ArrayObject ) :

les paires de lignes suivantes donnent les mêmes résultats (car le container utilisé est un ArrayObject instancié avec le flag ARRAY_AS_PROPS):

je vous renvoie à la documentation de ArrayObject  pour voire les méthodes disponibles

 le gestionnaire de sessions

le gestionnaire de session ( ou Zend\Session\SessionManager ) a la responsabilité de gérer les différents aspets de session (initialisation, configuration, destruction, persistance via un composants de stockage, regénération d’un identifiant de session, etc… ).

on n’est pas obligé de l’utiliser, mais on a souvent besoin de personnaliser le comportement des sessions (par ex, pour leur donner un domaine particulier, et un timeout particulier). dans ce cas la session aura besoin d’être paramètrée selon les besoin de l’application. pour ce faire, on fournira une config au gestionnaire de session ( Zend\Session\Config\StandardConfig ou Zend\Session\Config\SessionConfig) . j’utilise la classe SessionConfig dans ce qui suit.

Par défaut, quand on instancie un container, le gestionnaire de session par défaut est initialisé (s’il ne l’est pas déjà fait).

Au besoin, on peu utiliser un SessionManager pour un container donné. dans ce cas là, à l’instanciation du container, on peut fournir une instance du SessionManager en deuxième paramètre du constructeur.(pour paramétrer un container différemment des autres)

voici comment instancier un SessionManager simplement :

initialisation du SessionManager au démarrage de l’application:

on prendra soin de s’assurer que le module utilisé sera chargé avant ceux utilisant des containers pendant le bootstrap.

commençons par mettre en place la configuration du SessionManager dans le ficheir module.config.php du module:

 dans la classe Module :

Utilisation du SessionManager:

on pourrai avoir besoin d’accéder au gestionnaire de session pour des besoin spécifiques : démarrer la session (start()) arrêter la session (stop() ), regénérer l’ID de session, terminer la session, etc…

voici comment récupérer le gestionnaire de session à partir du container:

ou en récupérant le gestionnaire de session par défaut

les deux méthodes ( getManager() et getDefaultManager() ) retourneront le même gestionnaire si on n’a pas spécifié de SessionManager à l’instanciation d’un container

Voici quelques opérations  que l’on peut faire via le gestionnaire de session : détruire/terminer la session:


on peut vider les containers sans détruire la session: (les supports de stockage seront traité plus loins)

peut être appelé en milieu d’une session

regénèrer l’ID (via le support de persistance utilisé)

modifier le TTL d’un cookie en plein milieu d’une session

mettre à 0 seconde le TTL d’un cookie en plein milieu d’une session

utilisation à partie du container :

on utilisera la méthode getManager() pour récupérer le gestionnaire de session d’un container

(les méthodes précédentes peuvent être utilisée ici, et n’ont pas besoin d’être reproduite ici )

voici quelques exemples

vider les containers à partir d’un container :

vider le container ‘caddie':

( c’est un peut absurde de demander à un container de se vider en lui fournissant son nom une deuxième foi. je sais !!!)

le code précédent revient à faire :

ou  :

je croix que vous avez compris comment jongler entre les différentes manières.

Supports de stockage :

Dans une application web simple on se contente de stocker les sessions sur le serveur (ZF2 utilise par défaut Zend\Session\Storage\SessionArrayStorage pour stocker les sessions ).

pour des raisons de scalabilité/haute performance/haute disponibilité, il arrive que l’on aie besoin d’utiliser plusieurs serveur web redondés. comme exemple d’architecture courante on utilise souvent un load balancer qui envera chaque requête utilisateur sur un server web aléatoire, ce qui impose d’externaliser le stockage des session.

on a la possibilité d’utiliser des supports de stockages partageable entre plusieurs servers web :

  • cache (ex :memcaches, redis) via un objet Storage\Cache
  • db ( ex: mysql, postgres …)     via un objet Storage\DbTableGateway
  • nosql (mongodb)                       via un objet Storage\MongoDB

voici des exemples (tirés de la doc officielle):


exemple avec memcached :

(article en cours de rédaction. suite à venir )
Did you like this? Share it:

Comments are closed.

Open Close