PHP - Headers already sent by.....

Décembre 2016

Lorsque vous utilisez une fonction PHP qui manipule les en-têtes HTTP comme par exemple:
  • header()
  • setcookie()
  • session_start()


Il est important d'utiliser ces fonctions avant d'avoir généré le moindre flux vers le client. A partir du moment où une information a été envoyée au client (en général: un début d'affichage d'une page web), celà signifie que les en-têtes HTTP ont déjà été automatiquement envoyées au client. Ce genre de flux est souvent envoyé avec les fonctions echo, print, etc.

S'il ya un espace de libre avant la première ouverture de balise php, alors cet espace pourrait être envoyé comme début de page web au client et donc des en-têtes http le précéderont automatiquement pour signifier au client de quelle type de flux il s'agit. Voici un exemple d'en-tête avec la page d'accueil de CCM:
Server: Apache
X-Powered-By: Php/4.4.0-0.dotdeb.0
Keep-Alive: timeout=15, max=50
Connection: Keep-Alive
Transfert-Encoding: chunked
Content-type: text/html; charset=iso-8859-1


Donc il faut bien comprendre le système:
  • J'utilise echo, ou print au début de mon script. Idem, si j'ai un espace dans mon script qui n'est pas compris dans mes balises php, il sera considéré comme faisant partie de la source de la page à envoyer, et les en-têtes le précéderont. Ce qui peut provoquer une erreur du genre de celles dont on cherche la solution pendant plusieurs jours :-)
  • Le serveur envoie ces données, et les fait précéder par défaut d'en-têtes qui signifient que c'est une page html.
  • Si après cela dans mon script j'utilise une fonction qui touche aux en-têtes, elle ne pourra plus le faire car les en-têtes ont déjà été envoyées. J'obtiens donc une erreur du genre "headers already sent".

Utiliser header() après session_start()


Q: Mais comment je fais alors pour faire une redirection avec header() si j'utilise session_start() avant?

R: C'est impossible, en ce cas il faut choisir un moyen de faire une redirection, typiquement celà se fait en javascript, ou mieux: en html dans la balise meta refresh:
http://www.commentcamarche.net/faq/sujet 4640 webmaster faire une redirection

A voir également :

Ce document intitulé «  PHP - Headers already sent by.....  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.