Dernière mise à jour : le 30 avril 2003.
Par Hugo ETIEVANT
Sommaire
PréambuleCette petite FAQ n'a pas la prétention d'expliquer de façon exhaustive le système de session de PHP. Elle peut être améliorée. Pour toute suggestion : écrir à l'auteur. Les informations que vous y trouverez s'inspirent largement des messages postés sur le forum Developpez.com > Forum > PHP Où trouver de la documentation sur les sessions ?
Comment conserver des variables de page en page ?
Pourquoi utiliser les sessions ?
Comment fonctionne une session ?Les session permettent tout du long de la visite d'un internaute sur le site, de conserver des informations de façon transparentes. Cela est sans ralentissement de performances car le client ne stocke sous forme de
cookies que l'ID de session (généré aléatoirement), le serveur stockant sur disque le
contenu des variables dans le répertoire défini par Les sessions sont activées manuellement par la commande session_start() ou
automatiquement si Le serveur attribut à chaque visiteur un identifiant unique qui est soit envoyé au client sous forme de cookie (par défaut) soit passé de façon systématique dans l'URL. Comment démarrer une session ?Il existe trois manière de démarrer une session :
boolean session_start ( void)
Crée une session ou continue la session courante, en fonction de l'identifiant de session passé par l'URL (méthode GET) ou par un cookie.
Exemple :
<?php session_start() ; ... ?> Comment sauvegarder une variable dans une session ?Par l'usage de la commande session_register() dont voici la syntaxe : <?php session_start() ; $foobar = "Hello Word !"; session_register("foobar"); ... ?>Autre exemple avec le tableau superglobal $_SESSION :
<?php session_start() ; $_SESSION['foobar'] = "Hello Word !"; ... ?> Toute modification ultérieure dans le script des variables de session (avant la fermeture de la session) sera automatiquement répercutée autant dans la session que dans l'espace mémoire des données du script en exécution. Tous les types de variable sont acceptés par session_register() : chaînes, nombres, tableaux, objets (dont la classe doit être incluse avant le démarrage de la session). Exemple avec une variable objet :<?php require("../common/visitor.class.php"); session_start() ; $myVisitor = new Visitor(); session_register("myVisitor"); ... ?> Comment savoir si une variable appartient déjà a la session ?La commande session_is_registered renvoie VRAI si la variable dont l'identificateur est passé en paramètre a déjà été engegistré parmis les variables de session. Syntaxe : Exemple : <?php session_start() ; $foobar = "toto"; if(!session_is_registered("foobar")) { session_register("foobar"); } ... ?> Comment supprimer une variable d'une session ?La commande session_unregister() supprime une variable dans la session courante.
Elle a pour syntaxe : Il est aussi possible de purger toutes les variables de la session avec session_unset(). Si vous utilisez le tableau superglobal $_SESSION, il suffit alors d'utiliser unset() : Quelle est la durée de vie d'une session ?Dès que l'on ferme le navigateur la session est détruite. Sauf à configurer le fichier php.ini avec
Comment fermer une session ?Fermeture conservatrice :La commande session_write_close() écrit les valeurs des variables de session sur le serveur et ferme la session. Fermeture destructive :La commande session_destroy() détruit toutes les données enregistrées d'une session. Cette dernière commande est la plus utilisée car n'impose aucune sauvegarde au serveur. Retourne TRUE en cas de succès, et FALSE sinon. Quelles sont les méthodes PHP associées aux sessions ?session_cache_expire() -- Retourne la date d'expiration du cache de la session Quelles sont les erreurs possibles ?Répertoire de session inaccessibleWarning: open(/tmp\sess_3c80883ca4e755aa72803b05bce40c12, O_RDWR) failed: m (2) in c:\phpdev\www\bp\header.php on line 2 ou encorePHP Warning: Unknown(): open(/tmp\sess_3c80883ca4e755aa72803b05bce40c12, O_RDWR)
failed: No such file or directory (2) in Unknown on line 0 Cette erreur est due à l'absence du répertoire de sauvegarde (ici /tmp) des sessions ou bien au manque du droit d'écriture dans ce répertoire pour les visiteurs (utilisateur nobody, www-data ou autre... sous Apache). Le répertoire de sauvegarde est défini dans le php.ini :
Il faut donc:
PHP n'est pas autorisé à utiliser les sessionsIl faut s'assurer que le PHP est bien autorisé a créer des sessions. C'est juste un paramètre à activer. Faire un phpinfo() pour voir ces paramètres. La commande phpinfo() se contente d'afficher dans le navigateur le contenu du fichier de configuration php.ini. Avoir déjà écrit dans la pageWarning: Cannot send session cookie - headers already sent by (output started at /home/SiteWeb/SiteAnalyse/index.php:3) in /home/SiteWeb/SiteAnalyse/index.php on line 6Cette erreur survient lorsqu'on tente d'ouvrir une session après avoir déjà écrit dans le document, ce qui interdit, bien sûr. Tentative d'envoie d'entêtesWarning: Cannot add header information - headers already sent by (output started at /home/SiteWeb/SiteAnalyse/index.php:3) in /home/SiteWeb/SiteAnalyse/index.php on line 25Cette erreur survient lorsqu'on tente d'envoyer des entêtes grâce à la fonction header() après avoir écrit dans la page. On ne peut pas commencer une session après que le serveur ait envoyé au client les entêtes HTTP/1.0 (ou supérieures) de la page. Ainsi, la commande session_start() doit impérativement être exécutée avant tout envoi par le serveur d'entêtes HTTP au navigateur. L'identifiant de session étant envoyées sous forme de cookies au client, ce dernier doit être envoyé avant que la page ne s'affiche car l'affichage force l'envoie d'entêtes. Tout contenu texte placé avant session_start() (même un saut de ligne) provoque un affichage et donc l'envoie d'entêtes qui doivent précéder contenu de la page. Ce qu'il ne faut pas faire : <html> <body> <?php session_start(); ...ceci non plus : <?php echo "<html>"; ... session_start();Car cela provoque l'envoi d'entêtes au navigateur. Donc ces deux essais sont erronés. Il faut faire le session_start() avant toute chose !!! Même un simple saut de ligne dans le script avant session_start() provoque cette erreur. Défaut de déclaration de classeFatal error: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition utilisateur of the object you are trying to operate on was loaded _before_ the session was started in /home/SiteWeb/SiteAnalyse/test.php on line 12Lorsqu'une variable que l'on veut enregistrer dans une session est un objet, PHP doit pouvoir en connaître la description, il faut donc déclarer les classes avant de faire un session_start(). Qu'est-ce que sont les entêtes ?Le rôle des entêtes est d'échanger des méta-informations (informations à propos des informations échangées que sont les pages html générées ou non dynamiquement à partir de PHP) entre le serveur et le client. Exemples d'entêtes
Envoyer des entêtesLa commande header() du php permet l'envoi d'entêtes personnalisées. header("Location: home2.php3")pour rediriger le navigateur sur la page "home2.php3" Les entêtes peuvent servir à la redirection, à l'authentification, à l'envoi d'images au navigateur... Exemple typique qui marche<?php /* démarrage session */ session_start(); /* si la variables $NOM n'existe pas alors : */ if(!isset($NOM)) { $NOM = "Durand"; /* sauvegarde de la variable $NOM afin qu'elle soit connue dans les autres pages */ session_register("NOM"); echo "init"; } else { echo "pas d'init"; } echo $NOM echo "<a href=$PHP_SELF>recharger</a>" ?> Au premier chargement de cette page, la variable $NOM n'existera pas, on va donc la créer. Aux autres chargements, elles sera déjà présente (grace à la session), on ne fera donc pas d'initialisation... Comment configurer php.iniCi-après les options de configuration des sessions du fichier php.ini
Cas particulier de l'hébergeur FREE.FRCher free, le répertoire de sessions doit être à la racine de votre compte FTP. Il suffit donc de créer le répertoire sessions (au pluriel). Comment faire cohabiter sur le même serveur deux applications utilisant les sessions ?Dans le cas où un serveur HTTP héberge plusieurs applications PHP utilisant chacune les sessions, il peut y avoir des problèmes si plusieurs applications utilisent les mêmes variables de sessions (lorsque un utilisateur visite simultanément plusieurs applications). Pour résoudre ce problème il suffit de définir un nom de session différent pour chacune des applications lors de la création de la session : session_name('appli1'); session_start(); Puis de rappeler ce nom lors de l'utilisation des variables de la session dans l'application. session_name('appli1'); session_start(); Autre solution, au démarrage d'une nouvelle session, pour éviter tout conflit dans l'utilisation des noms de
variables de session, spécifier un autre chemin de sauvegarde des données de session avec
|