Hauptmenü

Untermenü

PHP/MySQL - Header - Pufferung

1. Die Abschnitte

2. Ein Hinweis

Wie ich im vorherigen Abschnitt schon erklärt habe, führen Ausgaben vor dem Absenden eines Headers unweigerlich zu einer Fehlermeldung, wenn die Ausgabepufferung nicht in der php.ini aktiviert worden ist. Wenn es der Provider erlaubt, kann man das über eine .htaccess oder im PHP-Code über ini_set einstellen. Aber da wir uns darauf bekanntlich verlassen sollten, zeige ich euch eine Möglichkeit, wie man das direkt per PHP machen kann. Und zwar so, dass es auf allen gängigen Servern läuft.

3. Output Buffering

Dabei geschieht Folgendes. Zuerst werden alle "normalen" Ausgaben zwischengespeichert. Dann werden alle Header-Daten gesendet und erst danach die restlichen Informationen.

4. Ein Beispiel


<?php
  ob_start();
  echo 'Bla blubb blubber';
  header('Content-Type: text/plain');
  ob_end_flush();
?>

Erläuterung

Zunächst wird mit ob_start(); die Ausgabepufferung begonnen. Damit veranlasst man, dass der gesamte Inhalt des echo-Befehls zwischengespeichert wird. Als Erstes kommt also unsere header-Anweisung zum Zug und wird an den Client/Browser gesendet. Erst danach jagt der Webserver die zwischengespeicherten Ausgaben hinter her. Mit ob_end_flush(); wird die Ausgabepufferung beendet und der Inhalt abgeschickt. Das Ergebnis ist in diesem Fall ein kleiner und ziemlich sinnloser Text.

Die Testdatei

... liegt im Unterordner output_buffer und schimpft sich ausgabepuffer.php. Spielt mal ein wenig damit herum. Entfernt den Code zur Pufferung und/oder ändert mal ein wenig die Reihenfolge. Dann werdet ihr das Prinzip sicher verstehen.

5. Wichtig!

Mit ob_start kann man nicht verhindern, dass euch Fehlermeldungen um die Ohren gehauen werden, wenn ihr vor dem <?php schon eine Ausgabe erzeugt, also zum Beispiel einen Zeilenumbruch, ein Leerzeichen oder ein BOM. Das könnt ihr sehr schön an der Datei ausgabepuffer_fehler.php in selbigem Ordner sehen, weil ich dort zu Beginn ein Leerzeichen eingefügt habe.

6. Weitere Möglichkeiten

ob_end_clean

Wenn man partout den Inhalt der Zwischenspeicherung nicht ausgeben will, so beendet man die Ausgabepufferung mittels ob_end_clean. Der Unterschied zu ob_end_flush liegt darin, dass der Puffer zusätzlich geleert wird.

ob_flush

Leert nur die Zwischenspeicherung. Im Gegensatz zu ob_end_flush bleibt aber der Ausgabepuffer erhalten.

ob_get_contents

Damit kann man den Inhalt der Zwischenspeicherung in einer Variable ablegen und diese dann später ausgeben, auch wenn die Ausgabepufferung schon beendet ist. Das Beispiel findet ihr in der ausgabepuffer_speichern.php.


<?php
  ob_start();
  echo 'Bla blubb blubber<br />';
  echo 'Schwall Jodelbla';
  $output ob_get_contents();
  header('Content-Type: text/html');
  ob_end_clean();
  echo $output;
?>

Hinweis

Wer es ganz genau wissen will, dem empfehle ich diesen Artikel aus dem Online-Manual. Da findet ihr einige gute Beispiel und die User-Notes sind auch recht informativ.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt