Déboguer son code PHPHeaders already sent by (ouput started at...

Télécharger la vidéo

Vous faites un header(), session_start() ou setcookie() et vous obtenez une erreur du type Headers already sent by (ouput started at ....php:1) in ...php on line 17.

La cause ?

Pour répondre à une requête, le serveur commence par renvoyer des en-têtes HTTP qui permettent aux navigateurs de connaitre le type de contenu obtenu, la méthode de cache à utiliser... Ensuite le serveur envoit le contenu qui sera alors interprété comme de l'HTML, du texte ou comme un fichier à télécharger.

Dès que du contenu est généré par PHP des en-tête sont automatiquement transmises au client. Aussi, plus tard, lorsque vous utilisez une des méthode citée plus haut PHP se retrouve bloqué car il ne peut pas modifier les en-têtes car elles ont déjà été envoyée.

La solution ?

Cette erreur est plutôt simple à déboguer car la première partie de l'erreur vous dit quel fichier a généré la sortie. Il vous suffit alors de retirer le contenu affiché avant l'utilisation des fonctions header(), session_start() ou setcookie().

Si malgré tout votre logique d'affichage doit se situer avant votre renvoi de contenu vous pouvez utiliser le système de buffer de PHP.

<?php ob_start(); ?>
<p>Ici j'écris de l'html</p>
<p>Et j'affiche mon contenu comme ça pour rire</p>
<?php
$content = ob_get_clean(); 
session_start();  // On modifie les en-têtes
echo $content;    // Et après on affiche le contenu
?>

Attention ! PHP peut "bufferiser" votre affichage de manière automatique et n'afficher le contenu qu'à la fin de l'éxécution de votre script. Pour cela il faut modifier le fichier php.ini et modifier la configuration correspondant à l'output_buffering.