So beheben Sie den Fehler "Header bereits gesendet" in PHP


831

Beim Ausführen meines Skripts werden folgende Fehler angezeigt:

Warnung: Header-Informationen können nicht geändert werden - Header, die bereits von ( Ausgabe gestartet unter /some/file.php:12 ) in /some/file.php in Zeile 23 gesendet wurden

Die in den Fehlermeldungen genannten Zeilen enthalten header()und setcookie()ruft auf.

Was könnte der Grund dafür sein? Und wie kann man das beheben?



Stellen Sie sicher, dass kein Text ausgegeben wird ( ob_startund ob_end_clean() sich hier als nützlich erweisen kann). Sie können dann ein Cookie oder eine Sitzung gleich setzen ob_get_contents()und dann ob_end_clean()den Puffer löschen.
Jack Tuck

Verwenden Sie die safeRedirectFunktion in meiner PHP-Bibliothek: github.com/heinkasner/PHP-Library/blob/master/extra.php
heinkasner

5
~~~~~~~~~~ Ihre Datei ENCODING sollte nicht sein UTF-8, aber UTF-8 (Without BOM)~~~~~~~~~~~
T.Todua

Antworten:


2997

Keine Ausgabe vor dem Senden von Headern!

Funktionen, die HTTP-Header senden / ändern, müssen aufgerufen werden, bevor eine Ausgabe erfolgt . summary ⇊ Andernfalls schlägt der Anruf fehl:

Warnung: Header-Informationen können nicht geändert werden - Header wurden bereits gesendet (Ausgabe gestartet am Skript: Zeile )

Einige Funktionen, die den HTTP-Header ändern, sind:

Die Ausgabe kann sein:

  • Unbeabsichtigt:

  • Absichtlich:

    • print, echoUnd andere Funktionen zum Erzeugen von Ausgang
    • Roher <html>Abschnitt vorheriger <?phpCode.

Warum passiert das?

Um zu verstehen, warum Header vor der Ausgabe gesendet werden müssen, muss eine typische HTTP- Antwort betrachtet werden. PHP-Skripte generieren hauptsächlich HTML-Inhalte, übergeben aber auch eine Reihe von HTTP / CGI-Headern an den Webserver:

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>

Die Seite / Ausgabe folgt immer den Überschriften. PHP muss zuerst die Header an den Webserver übergeben. Das kann es nur einmal. Nach dem doppelten Zeilenumbruch können sie nie mehr geändert werden.

Wenn PHP den ersten Ausgang empfängt ( print, echo, <html>) wird es bündig alle gesammelten Header. Danach kann es alle gewünschten Ausgaben senden. Das Senden weiterer HTTP-Header ist dann jedoch nicht möglich.

Wie können Sie herausfinden, wo die vorzeitige Ausgabe stattgefunden hat?

Die header()Warnung enthält alle relevanten Informationen zum Auffinden der Problemursache:

Warnung: Header-Informationen können nicht geändert werden - Header, die bereits von (Ausgabe gestartet unter / www / usr2345 / htdocs / auth.php: 52 ) in /www/usr2345/htdocs/index.php in Zeile 100 gesendet wurden

Hier bezieht sich "Zeile 100" auf das Skript, bei dem der header() Aufruf fehlgeschlagen ist.

Der Hinweis " Ausgabe gestartet um " in der Klammer ist wichtiger. Es bezeichnet die Quelle der vorherigen Ausgabe. In diesem Beispiel ist es auth.php und Linie52 . Dort musste man nach vorzeitiger Ausgabe suchen.

Typische Ursachen:

  1. Drucken, Echo

    Durch die absichtliche Ausgabe von printund echoAnweisungen wird die Möglichkeit zum Senden von HTTP-Headern beendet. Der Anwendungsfluss muss umstrukturiert werden, um dies zu vermeiden. Verwenden Sie Funktionen und Vorlagenschemata. Stellen Sie sicher, dass header()Anrufe erfolgen, bevor Nachrichten ausgeschrieben werden.

    Zu den Funktionen, die eine Ausgabe erzeugen, gehören:

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


    unter anderem und benutzerdefinierte Funktionen.

  2. Rohe HTML-Bereiche

    Nicht analysierte HTML-Abschnitte in einer .phpDatei werden ebenfalls direkt ausgegeben. Skriptbedingungen, die einen header()Aufruf auslösen , müssen vor allen Rohblöcken notiert <html>werden.

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

    Verwenden Sie ein Vorlagenschema, um die Verarbeitung von der Ausgabelogik zu trennen.

    • Platzieren Sie den Formularverarbeitungscode auf Skripten.
    • Verwenden Sie temporäre Zeichenfolgenvariablen, um Nachrichten zu verschieben.
    • Die eigentliche Ausgabelogik und die gemischte HTML-Ausgabe sollten zuletzt folgen.

  3. Leerzeichen vor <?phpfür "script.php Zeile 1 " Warnungen

    Wenn sich die Warnung auf die Ausgabe in Zeile bezieht 1, handelt es sich meistens um führende Leerzeichen , Text oder HTML vor dem öffnenden <?phpToken.

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

    Ebenso kann es bei angehängten Skripten oder Skriptabschnitten auftreten:

    ?>
    
    <?php

    PHP frisst tatsächlich einen einzelnen Zeilenumbruch nach dem Schließen von Tags auf. Es werden jedoch nicht mehrere Zeilenumbrüche, Tabulatoren oder Leerzeichen ausgeglichen, die in solche Lücken verschoben wurden.

  4. UTF-8-Stückliste

    Zeilenumbrüche und Leerzeichen allein können ein Problem sein. Es gibt aber auch "unsichtbare" Zeichenfolgen, die dies verursachen können. Am bekanntesten ist die UTF-8-Stückliste (Byte-Order-Mark), die von den meisten Texteditoren nicht angezeigt wird. Dies ist die Byte-Sequenz EF BB BF, die für UTF-8-codierte Dokumente optional und redundant ist. PHP muss es jedoch als Rohleistung behandeln. Es kann als Zeichen in der Ausgabe (wenn der Client das Dokument als Latin-1 interpretiert) oder als ähnlicher "Müll" angezeigt werden .

    Insbesondere grafische Editoren und Java-basierte IDEs sind sich ihrer Anwesenheit nicht bewusst. Sie visualisieren es nicht (verpflichtet durch den Unicode-Standard). Die meisten Programmierer und Konsoleneditoren tun jedoch Folgendes:

    Joe Editor zeigt UTF-8 BOM Platzhalter und MC Editor einen Punkt

    Dort ist das Problem leicht zu erkennen. Andere Editoren identifizieren möglicherweise das Vorhandensein in einem Datei- / Einstellungsmenü (Notepad ++ unter Windows kann das Problem identifizieren und beheben ). Eine weitere Option zum Überprüfen des Vorhandenseins von Stücklisten besteht darin, auf einen Hexeditor zurückzugreifen . On * nix-Systeme hexdumpsind normalerweise verfügbar, wenn nicht eine grafische Variante, die die Prüfung dieser und anderer Probleme vereinfacht:

    Beav Hexeditor zeigt Utf-8 Bom

    Eine einfache Lösung besteht darin, den Texteditor so einzustellen, dass Dateien als "UTF-8 (keine Stückliste)" oder eine ähnliche Nomenklatur gespeichert werden. Oft greifen Neulinge ansonsten dazu, neue Dateien zu erstellen und den vorherigen Code einfach wieder zu kopieren und einzufügen.

    Korrekturdienstprogramme

    Es gibt auch automatisierte Tools zum Überprüfen und Umschreiben von Textdateien ( sed/awk oder recode). Für PHP gibt es speziell das phptagsTag aufgeräumter . Es schreibt geschlossene und geöffnete Tags in lange und kurze Formulare um, behebt aber auch problemlos führende und nachfolgende Whitespace-, Unicode- und UTF-x-Stücklistenprobleme:

    phptags  --whitespace  *.php

    Es ist vernünftig, ein gesamtes Include- oder Projektverzeichnis zu verwenden.

  5. Leerzeichen nach ?>

    Wenn die Fehlerquelle hinter dem Schließen?> steht, wurde hier ein Leerzeichen oder Rohtext geschrieben. Der PHP-Endmarker beendet die Skriptausführung zu diesem Zeitpunkt nicht. Alle Text- / Leerzeichen danach werden weiterhin als Seiteninhalt ausgeschrieben.

    Insbesondere Neulingen wird allgemein empfohlen, nachfolgende ?>PHP-Close-Tags wegzulassen. Dies vermeidet einen kleinen Teil dieser Fälle. (Sehr häufig sind include()dSkripte der Schuldige.)

  6. Fehlerquelle als "Unbekannt in Zeile 0"

    Es ist normalerweise eine PHP-Erweiterung oder eine php.ini-Einstellung, wenn keine Fehlerquelle konkretisiert wird.

    • Es ist gelegentlich die gzipStream-Codierungseinstellung oder dieob_gzhandler .
    • Es kann sich aber auch um ein doppelt geladenes extension=Modul handeln, das eine implizite PHP-Start- / Warnmeldung generiert.

  7. Vorhergehende Fehlermeldungen

    Wenn eine andere PHP-Anweisung oder ein anderer Ausdruck dazu führt, dass eine Warnmeldung oder ein Hinweis ausgedruckt wird, gilt dies auch als vorzeitige Ausgabe.

    In diesem Fall müssen Sie den Fehler vermeiden, die Ausführung der Anweisung verzögern oder die Nachricht mit zB isset()oder @()- unterdrücken, wenn dies das spätere Debuggen nicht behindert.

Keine Fehlermeldung

Wenn Sie error_reportingoder display_errorsdeaktiviert pro php.ini, dann zeigt keine Warnung auf. Das Ignorieren von Fehlern lässt das Problem jedoch nicht verschwinden. Header können nach vorzeitiger Ausgabe immer noch nicht gesendet werden.

Wenn header("Location: ...")Umleitungen stillschweigend fehlschlagen, ist es sehr ratsam, nach Warnungen zu suchen. Aktivieren Sie sie mit zwei einfachen Befehlen über dem Aufrufskript erneut:

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

Oder set_error_handler("var_dump");wenn alles andere fehlschlägt.

Apropos Redirect-Header: Für endgültige Codepfade sollten Sie häufig eine solche Redewendung verwenden:

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

Vorzugsweise sogar eine Dienstprogrammfunktion, die bei header()Fehlern eine Benutzermeldung druckt .

Ausgabepufferung als Problemumgehung

Die Ausgabepufferung von PHPs ist eine Problemumgehung, um dieses Problem zu beheben . Es funktioniert oft zuverlässig, sollte jedoch die ordnungsgemäße Strukturierung der Anwendung und die Trennung der Ausgabe von der Steuerlogik nicht ersetzen. Der eigentliche Zweck besteht darin, die Übertragung von Chunks auf den Webserver zu minimieren.

  1. Die output_buffering= Einstellung kann trotzdem helfen. Konfigurieren Sie es in der php.ini oder über .htaccess oder sogar .user.ini in modernen FPM / FastCGI-Setups.
    Durch Aktivieren kann PHP die Ausgabe puffern, anstatt sie sofort an den Webserver weiterzuleiten. PHP kann somit HTTP-Header aggregieren.

  2. Es kann ebenfalls mit einem Aufruf zum ob_start(); Aufrufen des Aufrufskripts verbunden werden. Was jedoch aus mehreren Gründen weniger zuverlässig ist:

    • Selbst wenn <?php ob_start(); ?> das erste Skript gestartet wird, werden Leerzeichen oder Stücklisten möglicherweise zuvor gemischt, wodurch es unwirksam wird .

    • Es kann Leerzeichen für die HTML-Ausgabe verbergen. Sobald die Anwendungslogik jedoch versucht, binären Inhalt (z. B. ein generiertes Bild) zu senden, wird die gepufferte Fremdausgabe zu einem Problem. (Notwendig ob_clean() als weitere Problemumgehung.)

    • Der Puffer ist in seiner Größe begrenzt und kann leicht überlaufen, wenn die Standardeinstellungen beibehalten werden. Und das ist auch keine Seltenheit, schwer zu finden, wenn es passiert.

Beide Ansätze können daher unzuverlässig werden - insbesondere beim Wechsel zwischen Entwicklungs-Setups und / oder Produktionsservern. Aus diesem Grund wird die Ausgabepufferung allgemein nur als Krücke / strikte Problemumgehung betrachtet.

Siehe auch das grundlegende Verwendungsbeispiel im Handbuch und weitere Vor- und Nachteile:

Aber es hat auf dem anderen Server funktioniert!?

Wenn Sie die Header-Warnung zuvor nicht erhalten haben, wird die Einstellung php.ini für die Ausgabepufferung verwendet geändert. Es ist wahrscheinlich auf dem aktuellen / neuen Server nicht konfiguriert.

Überprüfen mit headers_sent()

Sie können jederzeit headers_sent()prüfen, ob es noch möglich ist, ... Header zu senden. Dies ist nützlich, um eine Information bedingt auszudrucken oder eine andere Fallback-Logik anzuwenden.

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

Nützliche Fallback-Problemumgehungen sind:

  • HTML- <meta>Tag

    Wenn Ihre Anwendung strukturell schwer zu reparieren ist, können Sie auf einfache (aber etwas unprofessionelle) Weise, um Weiterleitungen zuzulassen, ein HTML- <meta>Tag einfügen. Eine Weiterleitung kann erreicht werden mit:

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

    Oder mit kurzer Verzögerung:

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

    Dies führt zu ungültigem HTML, wenn es nach dem <head>Abschnitt verwendet wird. Die meisten Browser akzeptieren es immer noch.

  • JavaScript-Umleitung

    Alternativ kann eine JavaScript-Umleitung für Seitenumleitungen verwendet werden:

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

    Dies ist häufig HTML-kompatibler als die <meta>Problemumgehung, erfordert jedoch JavaScript-fähige Clients.

Beide Ansätze machen jedoch akzeptable Fallbacks, wenn echte HTTP-Header () -Aufrufe fehlschlagen. Idealerweise kombinieren Sie dies immer mit einer benutzerfreundlichen Nachricht und einem anklickbaren Link als letzten Ausweg. (Welches ist zum Beispiel das, was der http_redirect () PECL-Erweiterung tut.)

Warum setcookie()undsession_start() sind auch betroffen

Beide setcookie()und session_start()müssen eine sendenSet-Cookie: HTTP-Header . Es gelten daher die gleichen Bedingungen, und für vorzeitige Ausgabesituationen werden ähnliche Fehlermeldungen generiert.

(Natürlich sind sie außerdem von deaktivierten Cookies im Browser oder sogar von Proxy-Problemen betroffen. Die Sitzungsfunktionalität hängt natürlich auch vom freien Speicherplatz und anderen php.ini-Einstellungen usw. ab.)

Weitere Links


Auch reguläre notepad.exe ist schwierig. Normalerweise verwende ich NetBeans, die keine Stückliste hinzufügen, auch wenn die Datei so codiert ist. Das spätere Bearbeiten einer Datei im Editor bringt die Dinge durcheinander, insbesondere gegenüber IIS als Webserver. Es scheint, als würde Apache die (uneinheitlich hinzugefügte) Stückliste verwerfen.
Teson

4
Das Entfernen des Schließens ?>vom Ende einer PHP-Datei ist normalerweise eine gute Vorgehensweise, um diese Fehler ebenfalls zu minimieren. Unerwünschte Leerzeichen treten am Ende von Dateien nicht auf, und Sie können der Antwort später noch Header hinzufügen. Dies ist auch praktisch, wenn Sie die Ausgabepufferung verwenden und keine zusätzlichen unerwünschten Leerzeichen am Ende der von den enthaltenen Dateien generierten Teile sehen möchten.
Nikita 8

Seltsamerweise habe ich meine Datei von cPanel Linux Hosting auf VPS verschoben. Bevor es richtig funktionierte, aber hier zeigte es diesen Fehler (ich hatte etwas HTML-Code vor dem Header). Warum?
Pablo Escobar

@ Purushotamrawat Haben Sie den Teil über " Aber es hat auf dem anderen Server
funktioniert!?

1
@PeterSMcIntyre Die UTF8-Stückliste vermutlich (behebt das) / keine Ausgabepufferung aktiviert (verlassen Sie sich nicht darauf).
Mario

199

Diese Fehlermeldung wird ausgelöst, wenn etwas gesendet wird, bevor Sie HTTP-Header (mit setcookieoder header) senden . Häufige Gründe für die Ausgabe vor den HTTP-Headern sind:

  • Versehentliches Leerzeichen, häufig am Anfang oder Ende von Dateien, wie folgt:

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

       Um dies zu vermeiden, lassen Sie einfach das Schließen weg ?>- es ist sowieso nicht erforderlich.

  • Byte-Ordnungsmarkierungen am Anfang einer PHP-Datei. Untersuchen Sie Ihre PHP-Dateien mit einem Hex-Editor, um herauszufinden, ob dies der Fall ist. Sie sollten mit den Bytes beginnen 3F 3C. Sie können die Stückliste sicher vom Dateianfang entfernen EF BB BF.
  • Explizite Ausgabe, wie Anrufe echo, printf, readfile, passthru, Code vor <?usw.
  • Eine von php ausgegebene Warnung, wenn die display_errorsEigenschaft php.ini festgelegt ist. Anstatt bei einem Programmiererfehler abzustürzen, behebt PHP den Fehler stillschweigend und gibt eine Warnung aus. Während Sie die Konfigurationen display_errorsoder error_reporting ändern können , sollten Sie das Problem lieber beheben.
    Häufige Gründe sind Zugriffe auf undefinierte Elemente eines Arrays (z. B. $_POST['input']ohne Verwendung emptyoder issetzum Testen, ob die Eingabe festgelegt ist) oder die Verwendung einer undefinierten Konstante anstelle eines Zeichenfolgenliteral (wie in $_POST[input], beachten Sie die fehlenden Anführungszeichen).

Durch Aktivieren der Ausgabepufferung sollte das Problem behoben werden. Alle Ausgaben nach dem Aufruf von werden ob_startim Speicher gepuffert, bis Sie den Puffer freigeben, z ob_end_flush. B. mit .

Während die Ausgabepufferung die Probleme vermeidet, sollten Sie wirklich feststellen, warum Ihre Anwendung einen HTTP-Body vor dem HTTP-Header ausgibt. Das wäre so, als würde man einen Anruf entgegennehmen und Ihren Tag und das Wetter besprechen, bevor Sie dem Anrufer mitteilen, dass er die falsche Nummer hat.


Es hilft mir, danke
Vishwa Pratap

122

Ich habe diesen Fehler schon oft erhalten, und ich bin sicher, dass alle PHP-Programmierer diesen Fehler mindestens einmal zuvor erhalten haben.

Mögliche Lösung 1

Dieser Fehler wurde möglicherweise durch Leerzeichen vor dem Start der Datei oder nach dem Ende der Datei verursacht. Diese Leerzeichen sollten nicht hier sein.

ex) HIER SOLLTEN KEINE LEEREN RAUME SEIN

   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

Überprüfen Sie alle Dateien, die der Datei zugeordnet sind, die diesen Fehler verursacht.

Hinweis: Manchmal fügen EDITOR (IDE) wie gedit (ein Standard-Linux-Editor) eine leere Zeile zur Sicherungsdatei hinzu. Dies sollte nicht passieren. Wenn Sie Linux verwenden. Sie können den VI-Editor verwenden, um Leerzeichen / Zeilen nach?> am Ende der Seite zu entfernen.

Mögliche Lösung 2: Wenn dies nicht der Fall ist, verwenden Sie ob_start, um die Pufferung auszugeben:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

Dadurch wird die Ausgabepufferung aktiviert und Ihre Header werden erstellt, nachdem die Seite gepuffert wurde.


18
ob_start()versteckt nur das Problem; Verwenden Sie es nicht, um dieses spezielle Problem zu lösen.
Ja͢ck

@ Ja͢ck Wenn ich nicht benutze ob_start(), was soll ich dann tun, um dieses Problem zu lösen:Headers already sent
Shafizadeh

@Sajad Wenn Sie den Fehler speziell aufgrund des von Ihnen verwendeten Editors erhalten, sollten Sie an den Einstellungen herumspielen, damit das Problem nicht mehr verursacht wird, oder die Editoren wechseln. Wenn Sie den Fehler aus einem anderen Grund erhalten, sollten Sie die Antworten in dieser Frage (insbesondere die akzeptierte Antwort) durchlesen, um herauszufinden, was das Problem tatsächlich ist, und um es zu lösen.
Samsquanch

3
ob_start()nicht „verstecken“ das Problem, es löst das Problem.
TMS

1
Ich hatte ein solches Problem, als ich meine Dateien auf den Server hochlud, der sogar PHP5.3 unterstützte. Verwenden Sie den Server mit PHP 5.6 oder höher
GGSoft

86

Anstelle der folgenden Zeile

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

schreiben

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

oder

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

Es wird definitiv Ihr Problem lösen. Ich hatte das gleiche Problem, aber ich habe es gelöst, indem ich die Position des Headers wie oben beschrieben geschrieben habe.


41

Sie machen

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

vor dem Setzen der Cookies, was nicht erlaubt ist. Sie können keine Ausgabe vor den Headern senden, nicht einmal eine leere Zeile.


32

Es liegt an dieser Zeile:

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

Sie sollten vor dem Senden der Header nichts drucken / wiedergeben .


31

ALLGEMEINE PROBLEME:

(kopiert von: Quelle )

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

1)echo.. Vor dem header(.......);Befehl sollte keine Ausgabe (dh oder HTML-Code) erfolgen .

2) Entfernen Sie Leerzeichen (oder Zeilenumbrüche ) vor <?phpund nach ?>Tags.

3) GOLDENE REGEL! - Überprüfen Sie, ob diese PHP-Datei (und auch, wenn Sie includeandere Dateien haben) UTF8 ohne Stücklistencodierung (und nicht nur UTF-8 ) hat. Das ist in vielen Fällen ein Problem (weil die UTF8- codierte Datei am Anfang der PHP-Datei etwas Besonderes hat, das Ihr Texteditor nicht anzeigt) !!!!!!!!!!!

4) Nachdem header(...);Sie verwenden müssenexit;

5) Verwenden Sie immer die Referenz 301 oder 302:

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

6) Aktivieren Sie die Fehlerberichterstattung und suchen Sie den Fehler. Ihr Fehler kann durch eine Funktion verursacht werden, die nicht funktioniert. Wenn Sie die Fehlerberichterstattung aktivieren, sollten Sie immer zuerst den häufigsten Fehler beheben. Beispielsweise könnte es sein: "Warnung: date_default_timezone_get (): Es ist nicht sicher, sich auf die Zeitzoneneinstellungen des Systems zu verlassen." - dann weiter unten sehen Sie möglicherweise den Fehler "Header nicht gesendet". Laden Sie Ihre Seite erneut, nachdem Sie den obersten (1.) Fehler behoben haben. Wenn Sie immer noch Fehler haben, beheben Sie erneut den obersten Fehler.

7) Wenn keiner der oben genannten Punkte hilft, verwenden Sie die JAVSCRIPT-Umleitung (jedoch eine stark nicht empfohlene Methode). Dies kann in benutzerdefinierten Fällen die letzte Chance sein ...:

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

Warum ist explizit einstellen 301oder 302wichtig?
Jānis Elmeris

26

Ein einfacher Tipp: Ein einfaches Leerzeichen (oder ein unsichtbares Sonderzeichen) in Ihrem Skript direkt vor dem ersten <?phpTag kann dies verursachen! Besonders wenn Sie in einem Team arbeiten und jemand eine "schwache" IDE verwendet oder mit seltsamen Texteditoren in den Dateien herumgespielt hat.

Ich habe diese Dinge gesehen;)


22

Eine andere schlechte Praxis kann dieses Problem hervorrufen, das noch nicht angegeben ist.

Siehe dieses Code-Snippet:

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

Die Dinge sind in Ordnung, oder?

Was ist, wenn "a_important_file.php" dies ist:

<?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-------------------

Das wird nicht funktionieren? Warum? Weil bereits eine neue Zeile generiert wird.

Obwohl dies kein alltägliches Szenario ist, was ist, wenn Sie ein MVC-Framework verwenden, das viele Dateien lädt, bevor Sie Dinge an Ihren Controller übergeben? Dies ist kein ungewöhnliches Szenario. Bereite dich darauf vor.

Aus PSR-2 2.2:


  • Alle PHP-Dateien MÜSSEN die verwenden Unix LF (linefeed) line ending.
  • Alle PHP-Dateien MÜSSEN mit a enden single blank line.
  • Das schließende?> -Tag MUSS omittedaus Dateien stammen, die enthaltenonly php

Glauben Sie mir, das Befolgen dieser Standards kann Ihnen verdammt viele Stunden Ihres Lebens ersparen :)


2
Nach mehreren Standards (z. B. Zend) sollten Sie das schließende ?>Tag auf keinen Fall in eine Datei
Daniel W.

Ich kann dies in einer Windows-Umgebung nicht reproduzieren, da es mit einer beliebigen Kombination funktioniert (Hinzufügen von schließenden Tags, Leerzeichen, Drücken der Eingabetaste usw.). Es scheint, dass dieses Problem hauptsächlich in Linux-Umgebungen auftritt.
Junior Mayhé

@JuniorM Es sollte reproduzierbar sein. Können Sie den Code, mit dem Sie experimentiert haben, oder etwas Ähnliches teilen?
MD. Sahib Bin Mahboob

Ich bin auf Windows 7, mit dem neuesten Wamp installiert. Ich denke, dieser Fehler hängt mit versteckten Zeichen für das Zeilenende zusammen. Die shortcodes.php von My Wordpress haben das Problem verursacht. Ich habe dieser Datei eine einfache Funktion hinzugefügt und sie hat diesen Fehler "Header gesendet" ausgelöst. Ich habe meine shortcodes.php mit WordPress verglichen und es war in Ordnung, außer derCR LF (typischen Windows-Zeilenende). Ich löse es, indem ich die Originaldatei von Wordpress Repo herunterlade, die LFstattdessen (Linux-Zeilenende) hat, CR LFund ich habe meine Funktion auch in die Datei functions.php des Themas verschoben. Basierend auf: bit.ly/1Gh6mzN
Junior Mayhé

@Sahib, beachte, dass ich immer noch nicht reproduzieren kann, was in dieser Antwort angegeben ist. Die Antwort ist für die Linux-Umgebung völlig in Ordnung. Ich habe Dinge getestet, die so leer sind?> <?php , Entfernen und Hinzufügen einer einzelnen Leerzeile, Hinzufügen und Weglassen des schließenden Tags?> . In Windows + Wamp funktionieren alle diese Kombinationen einwandfrei. Wierd ...
Junior Mayhé

15

Manchmal , wenn der Entwickler Prozess sowohl WIN Arbeitsplätze und Linux - Systemen hat (Hosting) und in dem Code , den Sie keine Ausgabe , bevor die betreffende Zeile sehen Sie, könnte es die Formatierung der Datei und den Mangel an sein Unix LF (Zeilenvorschub) Zeilenende .

Um dies schnell zu beheben, benennen wir die Datei normalerweise um und erstellen auf dem LINUX-System eine neue Datei anstelle der umbenannten und kopieren dann den Inhalt in diese. Oft löst dies das Problem, da einige der Dateien, die in WIN erstellt wurden, nachdem sie auf das Hosting verschoben wurden, dieses Problem verursachen.

Dieser Fix ist ein einfacher Fix für Websites, die wir per FTP verwalten, und kann unseren neuen Teammitgliedern manchmal Zeit sparen.


2

Im Allgemeinen tritt dieser Fehler auf, wenn wir nach dem Echo oder Drucken einen Header senden. Wenn dieser Fehler auf einer bestimmten Seite auftritt, stellen Sie sicher, dass auf dieser Seite nichts wiedergegeben wird, bevor Sie aufrufen start_session().

Beispiel für einen unvorhersehbaren Fehler:

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

//your page content

Noch ein Beispiel:

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

//your page content

Fazit: Geben Sie vor dem Aufruf kein Zeichen aus session_start()oder header()funktionieren Sie nicht einmal als Leerzeichen oder neue Zeile

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.