Comment corriger l'erreur «En-têtes déjà envoyés» en PHP

831

Lors de l'exécution de mon script, je reçois plusieurs erreurs comme ceci:

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

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

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

Moses89
la source
Assurez-vous qu'aucun texte n'est sorti ( ob_startet ob_end_clean() peut s'avérer utile ici). Vous pouvez ensuite définir un cookie ou une session égal à ob_get_contents(), puis utiliser ob_end_clean()pour effacer le tampon.
Jack Tuck
Utilisez la safeRedirectfonction dans ma bibliothèque PHP: github.com/heinkasner/PHP-Library/blob/master/extra.php
heinkasner
5
~~~~~~~~~~ Votre fichier ENCODING ne devrait pas l'être UTF-8, mais UTF-8 (Without BOM)~~~~~~~~~~~
T.Todua

Réponses:

2998

Pas de sortie avant d'envoyer des en-têtes!

Les fonctions qui envoient / modifient des en-têtes HTTP doivent être appelées avant toute sortie . summary ⇊ Sinon, l'appel échoue:

Avertissement: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés (sortie démarrée au script: ligne )

Certaines fonctions modifiant l'en-tête HTTP sont:

La sortie peut être:

  • Intentionnel:

    • print, echo Et d' autres fonctions fournissant une sortie
    • Code <html>antérieur des sections brutes <?php.

Pourquoi cela arrive-t-il?

Pour comprendre pourquoi les en-têtes doivent être envoyés avant la sortie, il est nécessaire de regarder une réponse HTTP typique . Les scripts PHP génèrent principalement du contenu HTML, mais transmettent également un ensemble d'en-têtes HTTP / CGI au serveur Web:

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

La page / sortie suit toujours les en-têtes. PHP doit d'abord transmettre les en-têtes au serveur Web. Il ne peut le faire qu'une seule fois. Après le double saut de ligne, il ne pourra plus les modifier.

Lorsque PHP reçoit la première sortie ( print, echo, <html>) il chasse d' eau tous les en- têtes collectées. Ensuite, il peut envoyer toutes les sorties souhaitées. Mais l'envoi d'autres en-têtes HTTP est alors impossible.

Comment savoir où la sortie prématurée s'est produite?

L' header()avertissement contient toutes les informations pertinentes pour localiser la cause du problème:

Avertissement: impossible de modifier les informations d'en-tête - en-têtes déjà envoyés par (sortie démarrée à / www / usr2345 / htdocs / auth.php: 52 ) dans /www/usr2345/htdocs/index.php sur la ligne 100

Ici, «ligne 100» fait référence au script où l' header() invocation a échoué.

La note " sortie commencée à " entre parenthèses est plus significative. Il dénomme la source de la production précédente. Dans cet exemple, c'est auth.php et line52 . C'est là que vous avez dû rechercher une sortie prématurée.

Causes typiques:

  1. Impression, écho

    La sortie intentionnelle de printet les echoinstructions mettront fin à la possibilité d'envoyer des en-têtes HTTP. Le flux d'application doit être restructuré pour éviter cela. Utilisez des fonctions et des modèles de modèles. Assurez header()- vous que les appels se produisent avant que les messages ne soient écrits.

    Les fonctions qui produisent une sortie incluent

    • print, echo, printf,vprintf
    • trigger_error, ob_flush, ob_end_flush, var_dump,print_r
    • readfile, passthru, flush, imagepng,imagejpeg


    entre autres et des fonctions définies par l'utilisateur.

  2. Zones HTML brutes

    Les sections HTML non analysées dans un .phpfichier sont également sorties directement. Les conditions de script qui déclencheront un header()appel doivent être notées avant tout<html> bloc brut .

    <!DOCTYPE html>
    <?php
        // Too late for headers already.

    Utilisez un modèle de modèle pour séparer le traitement de la logique de sortie.

    • Placez le code de traitement des formulaires au-dessus des scripts.
    • Utilisez des variables de chaîne temporaires pour différer les messages.
    • La logique de sortie réelle et la sortie HTML mélangée doivent suivre en dernier.

  3. Espace avant <?phppour les avertissements "script.php ligne 1 "

    Si l'avertissement fait référence à une sortie en ligne 1, il s'agit principalement d' espaces , de texte ou de HTML en tête avant le <?phpjeton d' ouverture .

     <?php
    # There's a SINGLE space/newline before <? - Which already seals it.

    De même, cela peut se produire pour des scripts ou des sections de script ajoutés:

    ?>
    
    <?php

    PHP mange en fait un seul saut de ligne après la fermeture des balises. Mais cela ne compensera pas les nouvelles lignes ou les tabulations ou les espaces décalés dans de tels écarts.

  4. BOM UTF-8

    Les sauts de ligne et les espaces seuls peuvent être un problème. Mais il y a aussi des séquences de caractères "invisibles" qui peuvent provoquer cela. Le plus connu est la nomenclature UTF-8 (Byte-Order-Mark) qui n'est pas affichée par la plupart des éditeurs de texte. Il s'agit de la séquence d'octets EF BB BF, qui est facultative et redondante pour les documents encodés en UTF-8. PHP doit cependant le traiter comme une sortie brute. Il peut apparaître sous la forme de caractères dans la sortie (si le client interprète le document en latin-1) ou des "ordures" similaires.

    En particulier, les éditeurs graphiques et les IDE basés sur Java sont inconscients de sa présence. Ils ne le visualisent pas (obligé par la norme Unicode). Cependant, la plupart des éditeurs de programmeurs et de consoles font:

    éditeur joes montrant l'espace réservé BOM UTF-8, et éditeur MC un point

    Là, il est facile de reconnaître le problème dès le début. D'autres éditeurs peuvent identifier sa présence dans un menu fichier / paramètres (le Bloc-notes ++ sur Windows peut identifier et résoudre le problème ). Une autre option pour inspecter la présence de nomenclatures consiste à recourir à un hexeditor . Les systèmes * nix hexdumpsont généralement disponibles, sinon une variante graphique qui simplifie l'audit de ces problèmes et d'autres:

    beav hexeditor montrant utf-8 bom

    Une solution simple consiste à définir l'éditeur de texte pour enregistrer les fichiers en tant que "UTF-8 (pas de nomenclature)" ou une autre nomenclature similaire. Souvent, les nouveaux arrivants recourent à la création de nouveaux fichiers et copient et collent simplement le code précédent.

    Utilitaires de correction

    Il existe également des outils automatisés pour examiner et réécrire les fichiers texte ( sed/awk ou recode). Pour PHP en particulier, il y a le phptagstag tidier . Il réécrit les balises de fermeture et d'ouverture en formes longues et courtes, mais résout également facilement les problèmes d'espaces blancs de début et de fin, Unicode et UTF-x:

    phptags  --whitespace  *.php

    Il est raisonnable de l'utiliser sur un répertoire d'inclusion ou de projet.

  5. Espace après ?>

    Si la source d'erreur est mentionnée comme derrière la fermeture,?> c'est là que des espaces ou du texte brut ont été écrits. Le marqueur de fin PHP ne termine pas l'exécution du script à ce stade. Tous les caractères de texte / espace après cela seront toujours écrits en tant que contenu de page.

    Il est généralement conseillé, en particulier aux nouveaux arrivants, que les ?>balises de fermeture PHP de fin soient omises. Cela évite une petite partie de ces cas. (Très souvent, les include()dscripts sont le coupable.)

  6. Source d'erreur mentionnée comme "Inconnu sur la ligne 0"

    Il s'agit généralement d'une extension PHP ou d'un paramètre php.ini si aucune source d'erreur n'est concrétisée.

    • C'est parfois le gzipparamètre d'encodage du flux ou leob_gzhandler .
    • Mais il peut également s'agir de n'importe quel extension=module doublement chargé générant un message implicite de démarrage / avertissement PHP.

  7. Messages d'erreur précédents

    Si une autre instruction ou expression PHP provoque l'impression d'un message ou d'un avertissement, cela compte également comme une sortie prématurée.

    Dans ce cas, vous devez éviter l'erreur, retarder l'exécution de l'instruction ou supprimer le message avec, par exemple, isset()ou @()- lorsque l'un ou l' autre n'entrave pas le débogage plus tard.

Pas de message d'erreur

Si vous avez error_reportingou display_errorsdésactivé par php.ini, aucun avertissement ne s'affichera. Mais ignorer les erreurs ne fera pas disparaître le problème. Les en-têtes ne peuvent toujours pas être envoyés après une sortie prématurée.

Ainsi, lorsque les header("Location: ...")redirections échouent silencieusement, il est très conseillé de rechercher des avertissements. Réactivez-les avec deux commandes simples au sommet du script d'invocation:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Ou set_error_handler("var_dump");si tout le reste échoue.

En parlant d'en-têtes de redirection, vous devez souvent utiliser un idiome comme celui-ci pour les chemins de code finaux:

exit(header("Location: /finished.html"));

De préférence même une fonction utilitaire, qui imprime un message utilisateur en cas de header()panne.

Tampon de sortie comme solution de contournement

La mise en mémoire tampon de sortie PHP est une solution de contournement pour résoudre ce problème. Il fonctionne souvent de manière fiable, mais ne doit pas se substituer à une bonne structuration de l'application et à la séparation de la sortie de la logique de contrôle. Son objectif réel est de minimiser les transferts par blocs vers le serveur Web.

  1. Le output_buffering= cadre peut néanmoins aider. Configurez-le dans le php.ini ou via .htaccess ou même .user.ini sur les configurations FPM / FastCGI modernes.
    L'activer permettra à PHP de tamponner la sortie au lieu de la transmettre instantanément au serveur Web. PHP peut donc agréger les en-têtes HTTP.

  2. Il peut également être engagé avec un appel au ob_start(); sommet du script d'invocation. Ce qui est cependant moins fiable pour plusieurs raisons:

    • Même s'il <?php ob_start(); ?>démarre le premier script, les espaces ou une nomenclature peuvent être mélangés avant, ce qui le rend inefficace .

    • Il peut cacher des espaces pour la sortie HTML. Mais dès que la logique d'application tente d'envoyer du contenu binaire (une image générée par exemple), la sortie étrangère en mémoire tampon devient un problème. (Nécessaire ob_clean() comme solution de contournement supplémentaire.)

    • Le tampon est de taille limitée et peut facilement dépasser lorsqu'il est laissé aux valeurs par défaut. Et ce n'est pas rare non plus, difficile à retrouver quand cela se produit.

Les deux approches peuvent donc devenir peu fiables - en particulier lors du basculement entre les configurations de développement et / ou les serveurs de production. C'est pourquoi la mise en mémoire tampon de sortie est largement considérée comme une béquille / strictement une solution de contournement.

Voir également l' exemple d'utilisation de base dans le manuel, et pour plus d'avantages et d'inconvénients:

Mais cela a fonctionné sur l'autre serveur!?

Si vous n'avez pas reçu d'avertissement d'en-tête auparavant, le paramètre de mise en mémoire tampon de sortie php.ini a changé. Il est probablement non configuré sur le serveur actuel / nouveau.

Vérification avec headers_sent()

Vous pouvez toujours utiliser headers_sent()pour sonder s'il est toujours possible d'envoyer des en-têtes. Ce qui est utile pour imprimer conditionnellement une information ou appliquer une autre logique de secours.

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}

Les solutions de rechange utiles sont:

  • HTML <meta>tag

    Si votre application est structurellement difficile à corriger, un moyen simple (mais quelque peu non professionnel) d'autoriser les redirections consiste à injecter une <meta>balise HTML . Une redirection peut être réalisée avec:

     <meta http-equiv="Location" content="http://example.com/">

    Ou avec un court délai:

     <meta http-equiv="Refresh" content="2; url=../target.html">

    Cela conduit à un code HTML non valide lorsqu'il est utilisé après la <head>section. La plupart des navigateurs l'acceptent toujours.

  • Redirection JavaScript

    Comme alternative, une redirection JavaScript peut être utilisée pour les redirections de page:

     <script> location.replace("target.html"); </script>

    Bien que cela soit souvent plus conforme à HTML que la <meta>solution de contournement, cela implique une dépendance à l'égard des clients compatibles JavaScript.

Les deux approches font cependant des solutions de rechange acceptables lorsque les appels HTTP header () authentiques échouent. Idéalement, vous combinez toujours cela avec un message convivial et un lien cliquable en dernier recours. (Ce qui est par exemple ce que fait l' extension http_redirect () PECL.)

Pourquoi setcookie()et session_start()sont également touchés

Les deux setcookie()et session_start()doivent envoyer un Set-Cookie:en-tête HTTP. Les mêmes conditions s'appliquent donc et des messages d'erreur similaires seront générés pour les situations de sortie prématurées.

(Bien sûr, ils sont en outre affectés par les cookies désactivés dans le navigateur, ou même par des problèmes de proxy. La fonctionnalité de session dépend évidemment aussi de l'espace disque libre et d'autres paramètres php.ini, etc.)

Liens supplémentaires

mario
la source
Notepad.exe est également délicat. J'utilise NetBeans normalement qui n'ajoute pas de nomenclature, même si le fichier est ainsi codé. La modification d'un fichier plus tard dans le bloc-notes gâche les choses, en particulier vers IIS en tant que serveur Web. Il semble qu'apache rejette la nomenclature (ajoutée intentionnellement).
Teson
4
La suppression de la fermeture ?>de la fin d'un fichier php est généralement une bonne pratique qui permet également de minimiser ces erreurs. Les espaces blancs indésirables ne se produiront pas à la fin des fichiers et vous pourrez toujours ajouter des en-têtes à la réponse plus tard. Il est également pratique si vous utilisez la mise en mémoire tampon de sortie et que vous ne souhaitez pas voir d'espace blanc indésirable ajouté à la fin des parties générées par les fichiers inclus.
Nikita
Chose étrange, j'ai déplacé mon fichier de l'hébergement Linux cPanel vers VPS. Avant, il fonctionnait correctement, mais ici, il montrait cette erreur (j'avais du code html avant l'en-tête). Pourquoi?
Pablo Escobar
@Purushotamrawat Avez-vous lu la partie sur " Mais cela a fonctionné sur l'autre serveur!? "
mario
1
@PeterSMcIntyre La nomenclature UTF8 vraisemblablement (corrige cela) / aucune mise en mémoire tampon de sortie activée (ne vous fiez pas à cela).
mario
199

Ce message d'erreur est déclenché lorsque quelque chose est envoyé avant d'envoyer des en-têtes HTTP (avec setcookieou header). Les raisons courantes de produire quelque chose avant les en-têtes HTTP sont:

  • Espaces blancs accidentels, souvent au début ou à la fin des fichiers, comme ceci:

     <?php
    // Note the space before "<?php"
    ?>

       Pour éviter cela, il suffit de laisser de côté la fermeture ?>- ce n'est pas obligatoire de toute façon.

  • Ordre des octets marque au début d'un fichier php. Examinez vos fichiers php avec un éditeur hexadécimal pour savoir si c'est le cas. Ils devraient commencer par les octets 3F 3C. Vous pouvez supprimer la nomenclature en toute sécurité EF BB BFau début des fichiers.
  • Sortie explicite, comme les appels à echo, printf, readfile, passthru, code avant <?etc.
  • Un avertissement émis par php, si la display_errorspropriété php.ini est définie. Au lieu de planter sur une erreur de programmation, php corrige silencieusement l'erreur et émet un avertissement. Bien que vous puissiez modifier les configurations display_errorsou error_reporting , vous devriez plutôt résoudre le problème.
    Les raisons courantes sont les accès aux éléments non définis d'un tableau (comme $_POST['input']sans utiliser emptyou issetpour tester si l'entrée est définie), ou en utilisant une constante non définie au lieu d'un littéral de chaîne (comme dans $_POST[input], notez les guillemets manquants).

L'activation de la mise en mémoire tampon de sortie devrait faire disparaître le problème; toutes les sorties après l'appel à ob_startsont mises en mémoire tampon jusqu'à ce que vous libériez le tampon, par exemple avec ob_end_flush.

Cependant, bien que la mise en mémoire tampon de sortie évite les problèmes, vous devez vraiment déterminer pourquoi votre application génère un corps HTTP avant l'en-tête HTTP. Ce serait comme prendre un appel téléphonique et discuter de votre journée et de la météo avant de dire à l'appelant qu'il a le mauvais numéro.

phihag
la source
ça m'aide merci
Vishwa Pratap
122

J'ai eu cette erreur plusieurs fois auparavant, et je suis certain que tous les programmeurs PHP ont eu cette erreur au moins une fois auparavant.

Solution possible 1

Cette erreur peut avoir été provoquée par les espaces vides avant le début du fichier ou après la fin du fichier. Ces espaces vides ne doivent pas être ici.

ex) IL NE DOIT PAS Y AVOIR D'ESPACES BLANCHES ICI

   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

Vérifiez tous les fichiers associés au fichier à l'origine de cette erreur.

Remarque: Parfois, EDITOR (IDE) comme gedit (un éditeur Linux par défaut) ajoute une ligne vierge dans le fichier de sauvegarde. Cela ne devrait pas arriver. Si vous utilisez Linux. vous pouvez utiliser l'éditeur de VI pour supprimer les espaces / lignes après?> à la fin de la page.

Solution possible 2: Si ce n'est pas votre cas, utilisez ob_start pour sortir la mise en mémoire tampon:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

Cela activera la mise en mémoire tampon de sortie et vos en-têtes seront créés après la mise en mémoire tampon de la page.

Manish Shrivastava
la source
18
ob_start()cache juste le problème; ne l'utilisez pas pour résoudre ce problème particulier.
Ja͢ck
@ Ja͢ck Si je n'utilise pas de ob_start(), alors que dois-je faire pour résoudre ce problème:Headers already sent
Shafizadeh
@Sajad si vous obtenez l'erreur spécifiquement en raison de l'éditeur que vous utilisez, vous devez jouer avec les paramètres pour ne plus causer de problème ou changer d'éditeur. Si vous obtenez l'erreur pour une autre raison, vous devez lire les réponses à cette question (en particulier la réponse acceptée) pour comprendre quel est le problème et le résoudre.
Samsquanch
3
ob_start()ne "cache" pas le problème, il résout le problème.
TMS du
1
J'ai eu un tel problème lorsque je télécharge mes fichiers sur le serveur, qui supportait même PHP5.3 Utiliser le serveur avec PHP 5.6 ou plus
GGSoft
86

Au lieu de la ligne ci-dessous

//header("Location:".ADMIN_URL."/index.php");

écrire

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

ou

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Cela résoudra certainement votre problème. J'ai rencontré le même problème mais j'ai résolu en écrivant l'emplacement de l'en-tête de la manière ci-dessus.

Ipsita Rout
la source
41

Tu fais

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

avant de définir les cookies, ce qui n'est pas autorisé. Vous ne pouvez envoyer aucune sortie avant les en-têtes, pas même une ligne vierge.

Seth Carnegie
la source
32

C'est à cause de cette ligne:

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

Vous ne devez rien imprimer / faire écho avant d'envoyer les en-têtes.

Sarfraz
la source
31

PROBLÈMES COMMUNS:

(copié de: source )

====================

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

2) supprimez tout espace blanc (ou nouvelle ligne ) avant <?phpet après les ?>balises.

3) RÈGLE D'OR! - vérifiez si ce fichier php (et aussi, si vous avez d' includeautres fichiers) a UTF8 sans encodage BOM (et pas seulement UTF-8 ). C'est un problème dans de nombreux cas (car le fichier encodé UTF8 a quelque chose de spécial au début du fichier php, que votre éditeur de texte ne montre pas) !!!!!!!!!!!!

4) Après avoir header(...);utiliséexit;

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

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

6) Activez le rapport d'erreurs et recherchez l'erreur. Votre erreur peut être due à une fonction qui ne fonctionne pas. Lorsque vous activez le rapport d'erreurs, vous devez toujours corriger l'erreur la plus élevée en premier. Par exemple, il peut s'agir de "Avertissement: date_default_timezone_get (): il n'est pas sûr de s'appuyer sur les paramètres de fuseau horaire du système." - puis plus bas, vous pouvez voir l'erreur "en-têtes non envoyés". Après avoir corrigé l'erreur la plus élevée (1ère), rechargez votre page. Si vous avez encore des erreurs, corrigez à nouveau l'erreur la plus élevée.

7) Si rien de ce qui précède ne vous aide, utilisez la redirection JAVSCRIPT (cependant, méthode fortement non recommandée), peut être la dernière chance dans les cas personnalisés ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;
T.Todua
la source
Pourquoi est-il explicitement défini 301ou 302important?
Jānis Elmeris
26

Un conseil simple: un simple espace (ou caractère spécial invisible) dans votre script, juste avant la toute première <?phpbalise, peut provoquer cela! Surtout lorsque vous travaillez en équipe et que quelqu'un utilise un IDE «faible» ou a gâché les fichiers avec d'étranges éditeurs de texte.

J'ai vu ces choses;)

Sliq
la source
22

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

Voir cet extrait de code:

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

Les choses vont bien, non?

Et si "a_important_file.php" est 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 que déjà une nouvelle ligne est générée.

Maintenant, bien que ce ne soit pas un scénario courant, que se passe-t-il si vous utilisez un framework MVC qui charge beaucoup de fichiers avant de transférer des choses à votre contrôleur? Ce n'est pas un scénario rare. Soyez prêt pour cela.

Depuis PSR-2 2.2:


  • Tous les fichiers PHP DOIVENT utiliser le Unix LF (linefeed) line ending.
  • Tous les fichiers PHP DOIVENT se terminer par un single blank line.
  • La balise de fermeture?> DOIT provenir omittedde fichiers contenantonly php

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

MARYLAND. Sahib Bin Mahboob
la source
2
Selon plusieurs normes (Zend par exemple), vous ne devez ?>en aucun cas mettre la balise de fermeture dans un fichier
Daniel W.
Je ne peux pas reproduire cela dans l'environnement Windows car cela fonctionne en utilisant n'importe quelle combinaison (ajout de balises de fermeture, de blancs, pression de la touche Entrée, etc.). Il semble que ce problème se produit principalement dans les environnements Linux.
Junior Mayhé
@JuniorM Il doit être reproductible. Pouvez-vous partager le code que vous expérimentiez dans un sens ou quelque chose de similaire?
MD. Sahib Bin Mahboob
Je suis sur Windows 7, avec la dernière version de Wamp installée. Je pense que ce bug est lié aux caractères cachés pour la fin de ligne. Le shortcodes.php de mon Wordpress était à l'origine du problème. J'ai ajouté à ce fichier une fonction simple et il a commencé à déclencher cette erreur "en-têtes envoyés". J'ai comparé mon shortcodes.php avec wordpress 'et c'était correct, sauf le CR LF(fin de ligne Windows typique). Je le résout en téléchargeant le fichier d'origine à partir du dépôt Wordpress qui a LF(fin de ligne Linux) au lieu de CR LFet j'ai également déplacé ma fonction vers le fichier functions.php du thème. Basé sur: bit.ly/1Gh6mzN
Junior Mayhé
@Sahib, notez que je ne peux toujours pas reproduire ce qui est indiqué dans cette réponse. La réponse est tout à fait correcte pour un environnement Linux. J'ai testé des choses telles qu'un blanc entre ?> <?php, supprimer et ajouter une seule ligne vierge, ajouté et omis une balise de fermeture ?>. Dans Windows + Wamp, toutes ces combinaisons fonctionnent correctement. Wierd ...
Junior Mayhé
15

Parfois, lorsque le processus de développement a à la fois des stations de travail WIN et des systèmes LINUX (hébergement) et dans le code, vous ne voyez aucune sortie avant la ligne associée, il peut s'agir du formatage du fichier et de l'absence de fin de ligne Unix LF (linefeed) .

Ce que nous faisons habituellement pour résoudre rapidement ce problème, c'est renommer le fichier et sur le système LINUX créer un nouveau fichier au lieu du renommé, puis copier le contenu dans celui-ci. Plusieurs fois, cela résout le problème car certains des fichiers créés dans WIN une fois déplacés vers l'hébergement provoquent ce problème.

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

Lupin
la source
2

Généralement, cette erreur survient lorsque nous envoyons un en-tête après un écho ou une impression. Si cette erreur survient sur une page spécifique, assurez-vous que cette page ne fait aucun écho avant d'appeler start_session().

Exemple d'erreur imprévisible:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Un autre exemple:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Conclusion: ne sortez aucun caractère avant d'appeler session_start()ou header()ne fonctionne même pas un espace blanc ou une nouvelle ligne

Biswadeep Sarkar
la source