Pour briller dans les conversations autour de la machine à café, vous pouvez balancer une phrase du style : "HTTP est un protocole sans état et le WEB est un environnement de développement non connecté".

En effet, chacune des requêtes que fait un client est indépendante des autres et le serveur ne peut pas savoir qu'une série de demandes émane du même client. Cela pose problème dans certaines applications qui doivent pouvoir suivre les requêtes consécutives du même client.

Les applications de commerce électronique constituent l'exemple le plus évident de la nécessité de pouvoir regrouper les actions émanant d'un même utilisateur et de les sauvegarder dans un "panier électronique" qui suit le client tout au long de son parcours dans le site de commerce.
Les applications qui gère l'arrière-boutique (back-office en bon français) doivent aussi pouvoir partager des informations sur l'utilisateur pour savoir qui il est et à quelles pages il a accès pour effectuer les mises à jour dans les bases de données. Sans un mécanisme de gestion d'état, il faudrait que l'utilisateur se ré-authentifie chaque fois qu'il change de page.

Le mécanisme des sessions permet de répondre à ce besoin d'identification et de suivi d'un client dans les différentes demandes qu'il fait au même serveur.

La gestion d'une session permet de maintenir un état sur une série de demandes émanant du même client pendant un certain laps de temps, et le terme "session" fait référence au temps qu'un utilisateur passe sur un site Web particulier.

La gestion des sessions va nous permettre d'associer un utilisateur avec des données, tout au long de la visite qu'il fera des différentes pages du site. Par exemple, dans le cas d'un site de commerce, les différentes pages et actions peuvent être décomposées en remplissage du panier électronique, création d'un compte ou identification, vérification des articles, saisie des informations d'adresse et de moyen de paiement et validation définitive de la commande.

PHP suporte en natif la gestion des sessions :

- les "variables de session" sont stockées sur le serveur avec le choix entre un stockage en mémoire, dans des fichiers texte, ou dans une base de données.
- une numéro de session (session ID ou SID) est automatiquement généré pour identifier un utilisateur.
- le numéro de session est passé au client, soit dans un cookie, soit dans des en-tête GET/POST, soit dans l'URL de la page.

### Commencer une session

Pour commencer une session on utilise la fonction session_start().

Comme la fonction génère un en-tête HTTP (un cookie), les précautions habituelles doivent être respectées : pas de sortie autre que des en-têtes avant l'appel de la fonction, ou utilisation de la bufferisation (hautement conseillé).

L'appel de cette fonction doit être fait dans chacunes des pages qui vont utiliser le mécanisme des sessions.

Quand vous utilisez une session, je vous conseille d'avoir toujours un début de script comme :

    <?php
    ob_start();			// Démarre la bufferisation
    session_start();	// Démarre-reprend la session
    ...
    suite du script
    ...

Quand nous utilisons session_start(), PHP va vérifier si une session existe dèjà, c'est à dire si un identifiant de session (SID) a été affecté. Si ce n'est pas le cas (nouvelle session), PHP crée automatiquement un identifiant et l'affecte à la session. Si l'identifiant existe déjà, les variables de sessions sont chargées dans le tableau superglobal $_SESSION.

La fonction session_id() renvoie l'identifiant affecté par PHP. Par défaut cet identifiant est stocké côté client dans un cookie appelé PHPSESSID.

Exemple : démarrer une session
<?php ob_start(); session_start(); require('bib_fonctions.php'); htmlDebut('Session'); echo '<b>Identifiant de session</b>', '<br>avec la fonction session_id :', session_id(), '<br>dans le cookie : ', $_COOKIE['PHPSESSID']; htmlFin(); ?>

Vous remarquerez que la première fois que vous testez cette page, le cookie est vide. C'est normal, car rappelez-vous ce qui a été dit avant : "Les cookies écrits par un script ne sont pas accessibles immédiatement à l'intérieur du script. Il faut attendre que HTTP les ait transportés au moins une fois."

Si vous cliquez à nouveau sur le bouton 'Tester', vous verrez que la valeur du cookie est bien là car il y aura eu une échange HTTP.