Circum Blog

Circum Net – IT – Conseils pratiques

Redirection : Headers already sent by

PHP, Programmation

Lorsque l’on utilise une instruction PHP qui manipule les en-têtes HTTP (par exemple via la fonction ‘header’ permettant d’enclencher une redirection), il faut s’assurer des les appeler avant d’avoir généré le moindre flux de sortie vers le client.

En effet, dès qu’un début de contenu est envoyé via le serveur Web (soit via des instructions HTML classiques, soit via des instructions PHP d’output comme echo et print) cela implique que les en-têtes HTTP ont déjà été précisés et communiqués au client. Or, il n’est plus possible de remanier les en-têtes HTTP une fois qu’ils sont envoyés. En conséquence, si -après avoir produit du code HTML ou lancé des instructions ‘echo’- on utilise dans un script la fonction ‘header’ pour rediriger un appel de page, le moteur PHP génère automatiquement un message d’erreur ‘Headers already sent by …’.

Il y a toutefois un moyen d’éviter cette difficulté : en utilisant la bufferisation de sortie – c’est-à-dire la mise en mémoire temporaire des données de sortie. On utilisera pour cela les fonctions prédéfinies ‘ob_start’ et ‘ob_end_flush’.

ob_start()

ob_start() démarre la bufferisation de sortie. Tant qu’elle est enclenchée, les données -hormis les en-têtes- ne sont pas envoyées au navigateur, mais temporairement placées dans un buffer.

ob_end_flush()

ob_end_flush() envoie vers le client le contenu du buffer de sortie (s’il existe) et désactive la bufferisation.

Utilisation d’un buffer d’output

<?php
// Démarrage de la bufferisation de sortie
ob_start();
	
echo "Cet output est issu d'un buffer de sortie.";

// Envoi vers le client du contenu du buffer
ob_end_flush();
?>

Note : ob_gzhandler() est une fonction qui -combinée à ‘ob_start()’- permet l’envoi de données compressées aux navigateurs qui supportent les pages compressées. Elle détermine le type d’encodage accepté par un navigateur, et retourne le contenu le plus adéquat. Ce procédé réduit considérablement le poids des pages à délivrer.

Pages compressées

Pour compresser les pages à la volée : il suffit de placer en tête de fichier la ligne suivante :

<?php ob_start('ob_gzhandler'); ?>
 ... suite du code ou de l'output ...