Ich erklär dir mal was da eigentlich passiert, dann kannst du es denk ich selbst entscheiden, wo du das einbauen musst.
Output-Buffering wendet man an, wenn man verhindern möchte, das PHP den Output direkt und unmittelbar an den Client sendet, an der Stelle, im Code, wo man echo, printf, etc. eingebaut hat. Hier mal ein Beispiel-Code (nicht für den Einbau in deine Scripte bestimmt, sondern nur zum veranschaulichen):
PHP:
<?php
function viel_viel_logik_in_einer_funktion()
{
unset($variable);
/*
* unendlich viel weiterer Code hier....
* ...
*/
return 0;
}
session_start();
echo "<html><body>";
viel_viel_logik_in_einer_funktion();
echo "</body></html>";
Ok, schauen wir uns das mal an:
1. In dem Script oben wird zunächst eine Funktion definiert. Was die Funktion macht ist erstmal egal, wichtig ist aber, das in der Funktion Fehler sein könnten, die ein Notice, Warning, Error oder Fatal error nach sich ziehen.
2. Wir gehen mal davon aus, das in der Funktion ein Notice geworfen wird.
3. Unterhalb der Funktionsdefinition wird erstmal mittels session_start() ein Header (Cookie) an den Client gesendet.
4. Anschließend kommt ein bisschen Ausgabe
5. Die definierte Funktion wird aufgerufen
6. Widerum ein bisschen Ausgabe
- An Punkt 1 und 2 wird erstmal keine Information an den Client (Browser) geschickt, es ist ja nur eine Funktionsdefinition, deren Code noch nicht ausgeführt wird.
- An Punkt 3 wird ein HTTP-Header gesendet, also eine nicht direkt sichtbare Ausgabe im Browser, sondern eher Informationen über den nachfolgenden Output des Servers an den Client.
- Punkt 4 ist zum ersten mal eine unmittelbare Ausgabe an den Client
- Punkt 5 ist eine implizite unmittelbare Ausgabe an den Client, denn eine Notice wird auch als Content an den Browser gesendet, der es als Text darstellt.
- Punkt 6 ist eine unmittelbare Ausgabe an den Browser.
Unmittelbar heißt, in dem Moment, in dem der Code ausgeführt wurde, wird der Content bereits abgesendet.
Implizit bedeutet in dem Falle, das du nicht per Code eine Ausgabe machst, sondern PHP das selbst tut (außer das error_reporting ist entsprechend nicht eingestellt oder display_errors ist deaktiviert).
Da das HTTP-Protokol aber vorsieht, das der Server dem Client mitteilt, wieviel er (der Client) laden soll, ist der Beispiel-Code ein Verstoß gegen das HTTP-Protokol. Da du aber am Anfang des Scripts im Code noch nicht weißt, wieviele Bytes du wohl senden wirst, gibt es einen Trick:
Man hebt sich die Ausgabe bis zum Schluss auf, sendet erst nach dem kompletten Abarbeiten der Logik und Ausgaben einen HTTP-Header über die Länge des Inhalts, den die Ausgabe ergeben hat und erst dann die Ausgabe selbst. Das Aufheben kann man mit dem sog. Output-Buffering erledigen. PHP wird, wenn ob_start() aufgerufen wird, die Ausgaben nicht direkt an den Client senden, sondern in einem Puffer vorhalten. Wenn man ob_get_contents() aufruft, gibt PHP diesen Puffer zurück. ob_end_clean() löscht den Puffer. Wenn man den kompletten Inhalt der Ausgabe jetzt in einer Variablen hat, kann man die Länge mittels strlen() berechnen und HTTP-Protokoll-Konform dem Browser mitteilen, wieviele Daten man senden wird.
Mit dieser Erklärung solltest du es eigentlich selbst entscheiden können, wo im Code du das positionieren solltest.