Dans la programmation PHP, la fonction d'en-tête est utilisée pour envoyer des en-têtes HTTP bruts au client, qui est généralement utilisé pour la redirection, la définition de types de contenu, etc. Cependant, pendant le développement, nous pouvons rencontrer une erreur commune: les en-têtes déjà envoyés . Cette erreur se produit généralement lorsque vous essayez d'utiliser la fonction d'en-tête () après avoir envoyé la sortie.
Aujourd'hui, nous allons creuser dans la cause de cette erreur et utiliser un cas pratique pour montrer comment le résoudre en utilisant ob_start () .
Dans PHP, la fonction en-tête () doit être appelée avant que la page ne puisse quoi que ce soit. Si Header () est appelé après avoir sorti quelque chose (tel que les balises HTML, les espaces ou les messages d'erreur), PHP lancera des en-têtes déjà envoyés des erreurs. PHP essaiera d'envoyer un en-tête HTTP au navigateur, mais comme il y a déjà une sortie de contenu, il ne peut plus modifier l'en-tête HTTP, résultant en une erreur.
Espaces inattendus ou nouvelles lignes : la raison la plus courante est qu'il existe des espaces ou des lignes supplémentaires au début ou à la fin d'un fichier. Il y a une sortie avant la balise <? PHP au début du fichier PHP ou après la fin de la balise ?> , Ce qui entraînera automatiquement des en-têtes HTTP.
HTML ou autre contenu de sortie : si un script PHP sortit HTML, des instructions Echo ou une autre sortie non PHP avant d'appeler Header () , il provoquera des en-têtes déjà envoyées par des erreurs.
Une solution courante consiste à utiliser la fonction de tampon de sortie de PHP ob_start () pour éviter de sortir du contenu avant d'appeler Header () .
Supposons que nous ayons un script PHP simple qui essaie de rediriger vers une autre page mais rencontre une erreur d'en-têtes déjà envoyée lors de l'exécution.
Code de problème:
<?php
// Supposons qu'il y a un espace ou une pause de ligne inattendu au début du fichier
echo "This is some content before the header.";
// Essayez de rediriger
header("Location: http://m66.net/anotherpage.php");
exit();
?>
Si vous exécutez ce code, le navigateur peut afficher le message d'erreur suivant:
Warning: Cannot modify header information - headers already sent by (output started at /path/to/script.php:2) in /path/to/script.php on line 6
La raison du problème est qu'Echo sortira le contenu, provoquant l'envoi de l'en-tête HTTP. Par conséquent, lorsque la fonction d'en-tête () est appelée, l'en-tête ne peut plus être modifié.
Nous pouvons utiliser la fonction tampon de sortie de PHP pour résoudre ce problème. La fonction ob_start () permet le tampon de sortie, de sorte que même s'il y a de sortie dans le code, PHP stockera d'abord le contenu dans le tampon jusqu'à ce que le script soit exécuté ou ob_end_flush () .
Code résolu:
<?php
// Allumez le tampon de sortie
ob_start();
// Supposons qu'il y a un espace ou une pause de ligne inattendu au début du fichier
echo "This is some content before the header.";
// Essayez de rediriger
header("Location: http://m66.net/anotherpage.php");
exit();
// Terminer le tampon de sortie et tout envoyer
ob_end_flush();
?>
Dans ce code modifié, ob_start () permet le tampon de sortie. Même si Echo sort du contenu, le contenu n'est pas envoyé immédiatement au navigateur, mais est mis en cache dans le tampon jusqu'à ce que le script soit exécuté. Lorsque vous appelez la fonction en-tête () , PHP peut toujours modifier l'en-tête HTTP pour éviter les en-têtes déjà envoyées par erreur.
En utilisant OB_START () et le tampon de sortie, nous pouvons éviter l'erreur "En-têtes déjà envoyée" lors de l'appel de la fonction d'en-tête () . Cette approche est très utile dans le développement réel, surtout si vous n'avez aucun contrôle sur les autres sorties (telles que les fichiers importés ou les bibliothèques tierces).
Si vous rencontrez ce type d'erreur, vous pourriez aussi bien essayer d'ajouter ob_start () au début du code pour résoudre le problème. C'est une solution simple et efficace.