PHP headers_sent() Funktion: Alles, was Sie wissen müssen
Als PHP-Entwickler müssen Sie möglicherweise prüfen, ob HTTP-Header bereits an den Client gesendet wurden. headers_sent() ist eine eingebaute PHP-Funktion.
Jede HTTP-Antwort besteht aus zwei Teilen: einem Block mit Headern (Statuscode, Content-Type, Cookies, Weiterleitungen), gefolgt vom Antwort-Body. Das Problem dabei ist, dass Header gesendet werden müssen, bevor irgendeine Body-Ausgabe erfolgt. Sobald PHP ein einziges Byte des Bodys ausgibt, werden die Header geleert und gesperrt — jeder spätere Aufruf von header(), setcookie() oder session_start() löst dann die berüchtigte Warnung Cannot modify header information - headers already sent aus.
headers_sent() ist die eingebaute Funktion, mit der Sie — bevor Sie versuchen, einen Header zu senden — prüfen können, ob es bereits zu spät ist. Dieser Leitfaden behandelt die Syntax, die By-Reference-Parameter, was vorzeitige Ausgaben verursacht und wie man das Problem behebt.
Was headers_sent() tut
headers_sent() gibt einen booleschen Wert zurück:
true— Header wurden bereits gesendet (Ausgabe hat begonnen). Jeder weitere Aufruf vonheader()/setcookie()wird fehlschlagen.false— Es wurde noch keine Ausgabe gestartet, daher ist es noch sicher, Header zu setzen.
Wenn Sie die Header-Logik mit headers_sent() absichern, können Sie die Warnung vermeiden und elegant auf Fehler reagieren (z. B. das Problem protokollieren oder auf eine JavaScript-Weiterleitung zurückgreifen), anstatt die Seite zum Absturz zu bringen.
Syntax
headers_sent(string &$filename = null, int &$line = null): boolBeide Parameter sind optional und werden by reference übergeben. Wenn Header gesendet wurden, füllt PHP diese mit der Position der Ausgabe, die sie ausgelöst hat:
$filename— der Name der Quelldatei, in der die Ausgabe begann.$line— die Zeilennummer innerhalb dieser Datei.
Das macht headers_sent() beim Debuggen so nützlich: Es zeigt Ihnen direkt auf den Verursacher.
Grundlegende Verwendung
Prüfen Sie den Rückgabewert, bevor Sie einen Header senden:
<?php
if (!headers_sent()) {
header('Location: /dashboard');
exit;
}
echo 'Headers were already sent, cannot redirect via HTTP.';Wenn die Ausgabe noch nicht gestartet wurde, wird der Weiterleitungs-Header gesendet. Andernfalls vermeidet das Skript die fatale Warnung und gibt eine Fallback-Nachricht aus.
Den Ausgabe-Ursprung finden
Übergeben Sie die beiden Referenzvariablen, um genau herauszufinden, was die Header gesendet hat — unschätzbar wertvoll, wenn ein unbeabsichtigtes Leerzeichen oder echo in einer eingebundenen Datei vergraben ist:
<?php
if (headers_sent($file, $line)) {
echo "Headers already sent in $file on line $line";
} else {
setcookie('theme', 'dark');
echo 'Cookie set successfully.';
}Wenn die Bedingung wahr ist, erhalten Sie eine Meldung wie Headers already sent in /var/www/header.php on line 12, die Ihnen genau sagt, wo Sie suchen müssen.
Was „Headers Already Sent" auslöst
Alles, was vor Ihrem Header-Aufruf Body-Ausgabe erzeugt, leert die Header. Häufige Ursachen:
- Leerzeichen oder eine Leerzeile vor
<?php— selbst ein einzelnes Leerzeichen oder ein Zeilenumbruch zählt als Ausgabe. - Ein Zeilenumbruch nach dem schließenden
?>einer eingebundenen Datei. (Best Practice: Das schließende?>in reinen PHP-Dateien ganz weglassen.) echo,print,printfodervar_dump, die vor dem Header ausgeführt werden.- Eine UTF-8-Datei, die mit BOM gespeichert wurde (Byte-Order-Mark) — diese unsichtbaren führenden Bytes sind Ausgabe.
- PHP-Warnungen/Hinweise, die auf der Seite ausgegeben werden (wenn
display_errorsaktiviert ist), bevor die Header kommen.
Behebung mit Output-Buffering
Wenn Sie Ihren Code nicht so umstrukturieren können, dass alle Header zuerst kommen, wickeln Sie das Skript in einen Output-Buffer. ob_start() hält den Body im Speicher, anstatt ihn sofort zu senden, sodass Header bis zum Leeren des Buffers änderbar bleiben:
<?php
ob_start(); // start buffering — nothing is sent yet
echo 'Some early output';
// Still safe: the echo above is held in the buffer, headers are not sent
setcookie('user', 'jane');
header('X-App-Version: 2.0');
ob_end_flush(); // now send headers, then the buffered bodyDa die Ausgabe gepuffert wird, gibt headers_sent() nach dem echo weiterhin false zurück, und die späteren Aufrufe von setcookie() und header() sind erfolgreich.
Verwandte Funktionen
header()— einen rohen HTTP-Header senden.headers_list()— Header auflisten, die in der Warteschlange stehen oder bereits gesendet wurden.setcookie()— ein Cookie setzen (sendet einenSet-Cookie-Header).ob_start()— Output-Buffering starten, um das Senden von Headern zu verzögern.- PHP Sessions —
session_start()sendet ebenfalls Header und ist ein häufiger Auslöser.
Fazit
headers_sent() ist eine kleine, aber unverzichtbare Absicherung: Rufen Sie sie vor jedem header()-, setcookie()- oder session_start()-Aufruf auf, um zu prüfen, ob die Ausgabe bereits begonnen hat. Wenn true zurückgegeben wird, zeigen die By-Reference-Argumente $filename und $line genau auf die problematische Ausgabe, damit Sie sie beheben können — oder Sie wickeln Ihr Skript in ob_start(), damit Header änderbar bleiben, bis Sie bereit sind zu leeren.