&reftitle.examples;
Utilisation simple
Les sessions sont un moyen simple de stocker des données individuelles pour chaque
utilisateur en utilisant un identifiant de session unique. Elles peuvent être utilisées
pour faire persister des informations entre plusieurs pages. Les identifiants de session
sont normalement envoyés au navigateur via des cookies de session, et l'identifiant
est utilisé pour récupérer les données existantes de la session. L'absence d'un identifiant
ou d'un cookie de session indique à PHP de créer une nouvelle session, et génère ainsi
un nouvel identifiant de session.
Les sessions suivent une cinématique simple. Lorsqu'une session est démarrée, PHP va
soit récupérer une session existante en utilisant l'identifiant de session passé (habituellement
depuis un cookie de session) ou si aucun identifiant de session n'est passé, il va créer une
nouvelle session. PHP va ainsi peupler la variable superglobale $_SESSION
avec toutes les données de session une fois la session démarrée. Lorsque PHP s'arrête,
il va prendre automatiquement le contenu de la variable superglobale $_SESSION,
le sérialiser, et l'envoyer pour stockage au gestionnaire de sauvegarde de session.
Par défaut, PHP utilise en interne le gestionnaire de sauvegarde files
qui est défini via la directive session.save_handler.
Les données de session seront sauvegardées sur le serveur à l'endroit spécifié par
la directive de configuration session.save_path.
Les sessions peuvent être démarrées manuellement en utilisant la fonction
session_start. Si la directive de configuration
session.auto_start est définie à
1, une session démarrera automatiquement lors du début
de la demande.
Les sessions s'arrêtent automatiquement lorsque PHP a terminé d'exécuter un script, mais
peuvent être stoppées manuellement en utilisant la fonction
session_write_close.
Enregistrer une variable avec $_SESSION.
]]>
Retirer une variable de session avec la superglobale $_SESSION.
]]>
N'utilisez PAS la fonction unset
avec $_SESSION sous la forme
unset($_SESSION) sinon, cela rendra impossible
l'enregistrement de données dans la session en utilisant la super-globale
$_SESSION.
Vous ne pouvez pas utiliser les références sur des variables de session
car il n'y a aucune manière faisable de restaurer une référence vers une
autre variable.
Les sessions basées sur un fichier (par défaut en PHP) verrouillent
le fichier de session lorsqu'une session est ouverte via la fonction
session_start ou implicitement via la directive
de configuration session.auto_start.
Une fois verrouillée, aucun autre script ne peut accéder au même fichier
de session tant que la session n'a pas été fermée par le script
l'ayant ouverte, ou tant que la fonction
session_write_close n'a pas été appelée.
Ceci peut être génant pour les sites Web utilisant AJAX et produisant
plusieurs requêtes concurrentes. La façon la plus simple pour contourner
ce problème est d'appeler la fonction session_write_close
dès lors que les modifications dans la session ont été effectuées,
de préférence en début de script. Vous pouvez aussi utiliser
un autre gestionnaire de session qui supporte la concurrence.
Passer l'identifiant de session (session ID)
Il y a deux méthodes de propagation de l'identifiant de session :
Cookies
Par URL
Le module de session supporte les deux méthodes. Les cookies sont
optimaux, mais comme ils ne sont pas sûrs (tous les internautes
ne les acceptent pas), ils ne sont pas fiables. La seconde
méthode place l'identifiant de session directement dans les URL.
PHP est capable de faire cela de manière transparente.
Si l'option de compilation
session.use_trans_sid est activée,
les URLs relatives seront modifiées pour contenir l'identifiant
de session automatiquement.
L'option arg_separator.output
de &php.ini; vous permet de personnaliser le séparateur d'arguments.
Pour être complètement en accord avec les spécifications XHTML, spécifiez
& ici.
Alternativement, vous pouvez utiliser la constante SID
qui est définie si la session a commencé. Si le client n'envoie pas un cookie de session
approprié, il aura la forme session_name=session_id.
Sinon, il vaudra une chaîne vide. Ainsi, vous pouvez dans tous les cas
l'inclure dans l'URL.
L'exemple suivant vous montre comment enregistrer une variable et comment
réaliser un lien correct avec une autre page, avec
SID.
Compter le nombre de passages d'un utilisateur sur une page
]]>
La fonction htmlspecialchars est utilisée lors de l'affichage
du SID dans le but de contrer les attaques XSS.
L'affichage du SID, comme montré dans l'exemple
ci-dessus, n'est pas nécessaire si
--enable-trans-sid a été utilisé pour compiler
PHP.
Les URL non-relatives sont considérées comme externes au site, et ne
recevront pas le SID, car la fuite du SID
vers un serveur différent présente un risque de sécurité important.
Gestion personnalisée des sessions
Pour implémenter un stockage en base de données, ou toute autre méthode,
vous aurez besoin de la fonction session_set_save_handler pour
paramétrer vos propres fonctions de stockage.
Un gestionnaires de session peut être crée en utilisant l'interface
SessionHandlerInterface ou en étendant les
gestionnaires internes de PHP en héritant de la classe
SessionHandler.
Les fonctions de rappel précisées dans session_set_save_handler sont
des méthodes appelées par PHP pendant le cycle de vie de la session: open,
read, write et close
ainsi que les fonctions de ménage destroy pour supprimer une session
et gc pour une collecte périodique des gabarits.
Ainsi, PHP a toujours besoin d'un gestionnaire de sessions. Par défaut il s'agit du gestionnaire
interne 'files'. Un gestionnaire personnalisé peut être indiqué au moyen de
session_set_save_handler. D'autres gestionnaires alternatifs peuvent être proposés
par des extensions PHP, comme sqlite, memcache
et memcached et peuvent être utilisés via
session.save_handler.
Lorsque la session démarre, PHP appelera en interne la fonction open du gestionnaire, suivie de
read qui doit alors retourner une chaine encodée exactement comme elle a été passée lors du stockage.
Une fois que la fonction de rappel de read a retourné sa chaine, PHP va alors la décoder
et peupler la super-globale $_SESSION en conséquence.
Lorsque PHP se termine, (ou lorsque session_write_close est appelée), il va en
interne encoder le contenu de $_SESSION et le passer avec l'ID de session à la
fonction write. Après write, PHP invoquera close.
Lorsqu'une session est détruite, PHP appelera destroy avec l'ID de session.
PHP appelera la fonction de rappel gc de temps en temps pour nettoyer
les sessions expirées en fonction de leur
temps de vie maximum. Cet appel devrait mener à la destruction des enregistrements dans
le support de stockage qui n'ont été accédés depuis $lifetime.