Une page web peut enregistrer des informations dans un fichier sur le disque dur du visiteur. Ces informations sont appelées cookies et leur taille et leur nombre est limités. Les cookies permettent d'échanger des informations entre les pages au cours d'une même session de navigation, ou de garder ces informations dans le temps et de les rendre disponibles d'une connexion du client à une autre.

Les spécifications techniques de fonctionnement des cookies sont définies dans la recommandation RFC 2965 : http://www.faqs.org/rfcs/rfc2965

La transmission des cookies du serveur au client et du client au serveur se fait dans un en-tête HTTP. Il faut donc prendre les mêmes précautions que pour les redirections, et encore une fois les mécanismes de bufferisation seront particulièrement utiles.

Tous les dialogues client-serveur contiennent automatiquement dans leurs en-têtes HTTP tous les cookies auxquels une page à accès.

### Créér des cookies

L'envoi de cookie à un navigateur se fait très simplement avec la fonction setcookie().

L'instruction
setcookie('Nom', 'Piat', time()+3600*24, '/', '.monsite.fr');
envoie un cookie non sécurisé, appelé Nom, qui a la valeur Piat, dont la durée de vie sera de 24 heures, et qui sera accessible à toutes les pages du domaine 'site.fr'.

La valeur du cookie est automatiquement encodée URL lors de l'envoi du cookie, et automatiquement décodée lors de la réception du cookie.

La date d'expiration indique la durée de vie du cookie sur le client. Si aucune date n'est donnée, le cookie expire quand l'utilisateur ferme son navigateur. Si une date est donnée, elle doit être un timestamp valide qu'on peut obtenir par exemple avec time(), ou mktime(). La date d'expiration est comparée avec le temps du client qui peut être différent de celui du serveur.

Date d'expiration | Cookie valable
pas spécifiée | jusqu'à ce que l'utilisateur ferme son navigateur
time()+3600*12 | 12 heures à partir de maintenant
time()+3600*48 | 2 jours à partir de maintenant
mktime(0,0,0,12,31,2020) | jusqu'au 31 décembre 2020
time() - 3600 | le cookie est supprimé car sa date est dépassée

Le chemin indique le répertoire du site où le cookie possède une validité.

Chemin | Accessibilité
pas spécifié | seules les pages du répertoire de la page qui a défini le cookie ont accès au cookie.
/ | toutes les pages du domaine ont accès au cookie.
/repert | seules les pages du répertoire repert et de ses sous-répertoires éventuels ont accès au cookie.

Le domaine indique le nom DNS du site pour lequel le cookie est accesible. Par défaut, le nom du domaine est celui de la page qui a défini le cookie. La valeur de cet argument doit absolument comporter deux points.

Domaine | Accessibilité
pas spécifié | seules les pages du sous-domaine de la page qui a défini le cookie ont accès au cookie.
.monsite.fr | toutes les pages de tous les sous domaine du domaine monsite.fr ont accès au cookie.
www.monsite.fr | seules les pages du sous-domaine www du domaine monsite.fr ont accès au cookie.

La sécurisation indique si le cookie doit être transmis avec une connexion sécurisée HTTPS (1) ou avec une connexion HTTP normale (0). La valeur par défaut est 0.

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.

### Lire les cookies

Sur le serveur, la récupèration des cookies du client se fait par l'intermédiaire du tableau superglobal $_COOKIE. Les clés du tableau sont les noms des cookies, associées aux valeurs correspondantes.

Exemple : cookie
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Lire / écrire un cookie'); //------------------------------------------------------ // Phase de soumission du formulaire ? //------------------------------------------------------ // Si c'est le bouton Ecrire qui soumet le formulaire, // on écrit un cookie temporaire if (isset($_POST['btnEcrire'])) { $nom = trim($_POST['txtNom']); if ($nom != '') { setcookie($nom, $_POST['txtVal']); } } // Si c'est le bouton Lire qui soumet le formulaire, // on affiche la valeur du cookie du nom saisi, // ou on fait une boucle dans le tableau $_COOKIE // pour afficher tous les cookies trouvés if (isset($_POST['btnLire'])) { $nom = trim($_POST['txtNom']); if ($nom != '') { htmlInfo("Valeur du cookie $nom"); echo $_COOKIE[$nom]; } else { foreach ($_COOKIE as $cle => $val) { htmlInfo($cle); echo $val; } } } //------------------------------------------------------ // Affichage du formulaire //------------------------------------------------------ echo '<form method="post" ', 'action="', $_SERVER['PHP_SELF'], '">', '<label>Nom</label>', '<input type="text" name="txtNom">', '<label>Valeur</label>', '<input type="text" name="txtVal">', '<p><input type="submit" value="Ecrire" ', 'name="btnEcrire">', '<input type="submit" value="Lire" name="btnLire">', '</form>'; htmlFin(); ob_end_flush; ?>

La manipulation du tableau $_COOKIE n'a aucune influence sur les cookies.
On pourrait penser qu'en ajoutant un élement au tableau $_COOKIE :
$_COOKIE['nouveau'] = 'ça marche';
on créait un cookie. Il n'en est rien. Un nouvel élément sera bien ajouté au tableau, mais aucun cookie de nom nouveau avec la valeur 'ça marche' ne sera créé est envoyé au client.

De la même façon la modification de la valeur d'un cookie doit se faire absolument avec la fonction setcookie(). Si par exemple il existe un cookie avec le nom test et la valeur 1, l'instruction
$_COOKIE['test'] = 2;
n'aura aucune influence sur la valeur envoyée au client.

### Supprimer les cookies

Pour supprimer un cookie, la page doit avoir accès au cookie, et il faut utiliser la fonction setcookie() avec strictement les mêmes paramètres que ceux utilisés lors de la création du cookie.

Une valeur non spécifiée, ou vide supprime le cookie :
setcookie('Nom', '');
est équivalent à
setcookie('Nom');
et supprime le cookie appelé Nom.

On peut aussi définir une date d'expiration dépassée (time() - 3600 par exemple) :
setcookie('Nom', '', time() - 3600);