831 votes

Comment corriger l'erreur "Headers already sent" en PHP ?

Lorsque j'exécute mon script, j'obtiens plusieurs erreurs comme celle-ci :

Avertissement : Impossible de modifier les informations d'en-tête - les en-têtes ont déjà été envoyés par ( la sortie a commencé à /some/file.php:12 ) en /some/file.php sur ligne 23

Les lignes mentionnées dans les messages d'erreur contiennent header() y setcookie() appels.

Quelle pourrait en être la raison ? Et comment y remédier ?

0 votes

0 votes

Assurez-vous qu'aucun texte n'est édité ( ob_start y ob_end_clean() peut s'avérer utile ici). Vous pourriez alors définir un cookie ou une session égale à ob_get_contents() et ensuite utiliser ob_end_clean() pour vider le tampon.

0 votes

Utilisez le safeRedirect dans ma bibliothèque PHP : github.com/heinkasner/PHP-Library/blob/master/extra.php

37voto

Jorn Points 394

PROBLÈMES COMMUNS :

(copié de : source )

\====================

1) il ne devrait pas y avoir de sortie (c'est-à-dire que echo.. ou codes HTML) avant le header(.......); commandement.

2) supprimer tout espace blanc (ou nouvelle ligne ) avant <?php et après ?> tags.

3) RÈGLE D'OR ! - vérifier si ce fichier php (et aussi, si vous include d'autres fichiers) ont UTF8 sans BOM (et pas seulement UTF-8 ). C'est un problème dans de nombreux cas (parce que UTF8 le fichier encodé a un caractère spécial au début du fichier php, que votre éditeur de texte ne montre pas) !!!!!!!!!!!

4) Après header(...); vous devez utiliser exit;

5) utilisez toujours la référence 301 ou 302 :

header("location: http://example.com",  true,  301 );  exit;

6) Activez le rapport d'erreur, et trouvez l'erreur. Votre erreur peut être causée par une fonction qui ne fonctionne pas. Lorsque vous activez le signalement des erreurs, vous devez toujours commencer par corriger l'erreur la plus grave. Par exemple, cela pourrait être "Warning : date_default_timezone_get() : It is not safe to rely on the system's timezone settings". - Puis, plus bas, vous pouvez voir l'erreur "headers not sent". Après avoir corrigé l'erreur la plus haute (1ère), rechargez votre page. Si vous avez toujours des erreurs, corrigez à nouveau l'erreur la plus élevée.

7) Si rien de ce qui précède n'aide, utilisez la redirection JAVSCRIPT (cependant, méthode fortement déconseillée), qui peut être la dernière chance dans les cas particuliers... :

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

0 votes

Pourquoi la mise en place explicite 301 o 302 important ?

0 votes

Vous pouvez avoir une sortie si le "output_buffering" dans le fichier php.ini est défini. Le mien sur mon système Debian personnel est configuré à 4096. Celui du serveur que j'utilise indique qu'il n'a pas de paramètre.

33voto

Sarfraz Points 168484

C'est à cause de cette ligne :

printf ("Hi %s,</br />", $name);

Vous ne devez pas print/echo avant d'envoyer les en-têtes.

26voto

Panique Points 4680

Une astuce simple : un simple espace (ou une char spéciale invisible) dans votre script, juste avant le tout premier <?php peut provoquer cela ! Surtout lorsque vous travaillez en équipe et que quelqu'un utilise un IDE "faible" ou a manipulé les fichiers avec des éditeurs de texte étranges.

J'ai vu ces choses ;)

23voto

Une autre mauvaise pratique peut invoquer ce problème qui n'est pas encore énoncé.

Voir cet extrait de code :

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Les choses vont bien, n'est-ce pas ?

Et si "a_important_file.php" était ceci :

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Cela ne fonctionnera pas ? Pourquoi ? Parce qu'une nouvelle ligne est déjà générée.

Maintenant, bien que ce ne soit pas un scénario commun, que se passe-t-il si vous utilisez un cadre MVC qui charge un grand nombre de fichiers avant de transmettre les choses à votre contrôleur ? Ce n'est pas un scénario rare. Soyez prêt pour cela.

De PSR-2 2.2 :


  • Tous les fichiers PHP DOIVENT utiliser l'option Unix LF (linefeed) line ending .
  • Tous les fichiers PHP DOIVENT se terminer par un single blank line .
  • La balise de fermeture ?> DOIT être omitted à partir de fichiers contenant only php

Croyez-moi, suivre ces normes peut vous faire gagner beaucoup d'heures de votre vie :)

3 votes

Selon plusieurs standards (Zend par exemple), vous ne devriez pas mettre la fermeture ?> dans n'importe quel fichier, dans n'importe quel cas, de n'importe quelle manière

0 votes

Je ne peux pas reproduire ce problème dans l'environnement Windows, car il fonctionne avec n'importe quelle combinaison (ajout de balises de fermeture, d'espaces, pression de la touche Entrée, etc.) Il semble que ce problème se produise surtout dans les environnements Linux.

0 votes

@JuniorM Il devrait être reproductible. Pouvez-vous partager le code que vous avez expérimenté dans un gist ou quelque chose de similaire ?

16voto

Lupin Points 1185

Parfois, lorsque le processus de développement comporte à la fois des postes de travail WIN et des systèmes LINUX (hébergement) et que, dans le code, vous ne voyez aucune sortie avant la ligne correspondante, il peut s'agir du formatage du fichier et du manque de Unix LF (saut de ligne) fin de ligne.

Ce que nous faisons habituellement pour résoudre rapidement ce problème, c'est de renommer le fichier et, sur le système LINUX, de créer un nouveau fichier à la place du fichier renommé, puis d'y copier le contenu. Souvent, cela résout le problème, car certains des fichiers qui ont été créés dans WIN, une fois déplacés vers l'hébergement, causent ce problème.

Ce correctif est une solution facile pour les sites que nous gérons par FTP et peut parfois faire gagner du temps aux nouveaux membres de notre équipe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X