PHP/MySQL - Header - Pufferung
1. Die Abschnitte
- Erläuterung
- "Cannot modify ..."
- Pufferung
- Kleine Beispiele
- Internet Media Type
- Dateien
- Downloads
- Charset
- HTTP-Header
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