&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 linéariser, 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 <varname>$_SESSION</varname>. ]]> Retirer une variable de session avec la superglobale <varname>$_SESSION</varname>. ]]> 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 &amp; 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

Bonjour visiteur, vous avez vu cette page fois.

Pour continuer, cliquez ici.

]]>
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.