Einleitung: "Sie haben bereits etwas auf den Bildschirm ausgegeben, und ich kann nicht"
\nWenn Sie jemals auf Ihrer Website statt einer schönen Seite einen weißen Bildschirm mit der erschreckenden Meldung Warning: Cannot modify header information - headers already sent gesehen haben – Sie sind nicht allein. Dies ist wohl einer der häufigsten Fehler unter Anfängern (und nicht nur) in der PHP-Entwicklung. Auf Stack Overflow hat diese Frage Hunderttausende von Aufrufen erhalten, und die Anzahl der Kopien fehlerhaften Codes weltweit wird in Terabyte gemessen.
Die gute Nachricht ist jedoch, dass der Fehler "Headers already sent" kein Fluch ist, sondern lediglich eine strenge Erinnerung von PHP: "Hey, du hast bereits begonnen, HTML-Code zu senden, und versuchst jetzt, HTTP-Header zu ändern. Das geht nicht!".
\nIn diesem Artikel werden wir untersuchen, warum der Fehler headers already sent in PHP auftritt, wie man ihn findet und, am wichtigsten, wie man ihn ein für alle Mal behebt. Los geht's!
\n\n1. Was sind HTTP-Header und warum sind sie "bereits gesendet"?
\nBevor wir in den Code eintauchen, lassen Sie uns einfach erklären, was "unter der Haube" passiert. Wenn ein PHP-Skript ausgeführt wird, sendet es zuerst die HTTP-Header an den Browser. Diese enthalten Dienstinformationen: Inhaltstyp (Content-Type), Cookies (Set-Cookie), Weiterleitungen (Location), Antwortstatus (200, 404, 301) und so weiter.
Und erst nach allen Headern beginnt das Senden des Dokumentenkörpers – des HTML-Codes, den Sie auf der Seite sehen. PHP erlaubt es, Header nur bis zu dem Zeitpunkt zu ändern, an dem das erste Byte des Inhalts gesendet wurde.
\nSobald Sie etwas auf dem Bildschirm ausgeben (über echo, print, var_dump oder sogar nur ein Leerzeichen vor <?php), geht PHP davon aus, dass die Header bereits gesendet wurden. Jeder Versuch, header(), setcookie() oder session_start() danach aufzurufen, führt zu einem fatalen Fehler.
1.1. Klassisches Beispiel für den Fehler
\n<?php\necho "Hallo, Welt!";\n// Hoppla! Wir haben bereits etwas ausgegeben.\nheader("Location: https://example.com");\n// Warning: Cannot modify header information - headers already sent\n?>\nIn diesem Beispiel sendet echo Text an den Dokumentenkörper. Danach kann PHP die Header nicht mehr überschreiben, um eine Weiterleitung durchzuführen. Das ist logisch.
2. Top-5 Ursachen für "Headers already sent"
\nDer Fehler kann nicht nur durch ein explizites echo verursacht werden. Hier sind die häufigsten Szenarien, die selbst erfahrene Entwickler erwischen:
- \n
- Leerzeichen oder leere Zeile vor
<?php– der häufigste "Bug". Wenn in der Datei vor dem öffnenden Tag auch nur ein Leerzeichen steht, wird es an die Ausgabe gesendet. \n - Unsichtbare BOM-Zeichen (Byte Order Mark) – die Datei wurde in der Kodierung UTF-8 with BOM gespeichert. Die ersten 3 Bytes (EF BB BF) werden als Ausgabe betrachtet. \n
- Ausgabe aus eingebundenen Dateien – in der Datei
config.phpbefindet sich ein zusätzliches Leerzeichen nach?>. \n - Fehler und Warnungen – wenn PHP eine Warnung ausgibt (z. B. über die Verwendung einer undefinierten Variablen), gilt dies ebenfalls als Senden von Inhalt. \n
- Funktionen
print,printf,var_dumpvor header() – jede Ausgabefunktion zerstört die Header. \n
3. So finden Sie die Fehlerquelle: 3 Methoden
\nBevor Sie den Fehler beheben, müssen Sie herausfinden, woher die "zusätzliche" Ausgabe stammt. Verwenden Sie eine dieser Methoden.
\n\n3.1. Anzeige aller Fehler aktivieren
\nFügen Sie am Anfang des Skripts (vor jeder Ausgabe) hinzu:
\n<?php\nerror_reporting(E_ALL);\nini_set('display_errors', 1);\n?>\nPHP zeigt oft die genaue Zeile an, in der die Ausgabe erfolgte. Suchen Sie nach einer Meldung wie Output started at /path/to/file.php:12.
3.2. Verwenden der Funktion error_get_last()
\nSie können den letzten Fehler abfangen