W3docs

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 von header() / 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): bool

Beide 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, printf oder var_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_errors aktiviert 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 body

Da 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 einen Set-Cookie-Header).
  • ob_start() — Output-Buffering starten, um das Senden von Headern zu verzögern.
  • PHP Sessionssession_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.

Übung

Übung
Was kann die Warnung 'headers already sent' in PHP verursachen?
Was kann die Warnung 'headers already sent' in PHP verursachen?
Was this page helpful?