echo-Ausgaben abfangen

Ein kleiner Trick mit dem sich die Ausgaben von echo() aufzeichnen lassen und das Senden dieser verhindert wird.

Eigentlich ist es guter Stil, dass Funktionen/Methoden ihre Ergebnisse per return zurückgeben und dann das „übergeordnete” Programm entscheidet, wann diese gesendet werden. Häufig trifft man allerdings noch immer auf Funktionen oder Methoden, die stattdessen ihre Ergebnisse direkt per echo() an den Besucher senden. Das verringert die Flexibilität und verhindert zum Beispiel, dass die Ergebnisse nachbearbeitet werden (etwa mit einem regulären Ausdruck). Sehr häufig entsteht dadurch auch der headers already sent-Fehler (echo() bewirkt, dass die Header-Daten gesendet werden — danach darf man dann keine weiteren Header mehr senden und daher auch keine Cookies mehr ändern). Mit Hilfe von ob_start(), ob_get_contents() und ob_end_clean() lassen sich derartige Nerv-Funktionen bändigen indem ihre Ausgaben kurzerhand abgefangen werden.

Die drei Funktionen bewirken im einzelnen:
  • ob_start(): Startet das „Abfangen” bzw. Aufzeichnen. Nachfolgende Ausgaben per echo() werden gespeichert und nicht gesendet.
  • ob_enc_clean(): Gibt alle aufgezeichneten Ausgaben als String zurück.
  • ob_end(): Beendet das Abfangen/Aufzeichnen.

Beispiel:
PHP-Code
<?php
    echo("(1) Das wird sofort gesendet\n");

	// Abfangen starten
	ob_start();

	// Das wird abgefangen
	echo("(2) Das wird nicht sofort gesendet.\n");

	// Aufzeichnungen abspeichern
	$content = ob_get_contents();

	// Abfangen beenden
	ob_end_clean();

	// Etwas anderes senden
	echo("(3) Das wird jetzt als zweites gesendet.\n");

	// erst jetzt wird der abgefangene Inhalt gesendet
	echo($content);
?>
Ausgabe
(1) Das wird sofort gesendet
(3) Das wird jetzt als zweites gesendet.
(2) Das wird nicht sofort gesendet.

Hinweis: Die ob_* Funktionen lassen sich beliebig verschachteln. Hat man ob_start() also bereits aufgerufen (zum Beispiel um die Komprimierung per gzip zu aktivieren), dann kann man den vorherigen Code trotzdem bedenkenlos verwenden.

Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0