How-To: Komplette Seiten cachen
10. Oktober 2007
In meinen bisherigen Tutorials habe ich mich nur mit SQL Abfragen beschäftigt, aber es geht noch viel schneller.
Oft macht nicht die Datenbank alleine einen Großteil der Seitenaufbauzeit auch, sondern auch das Parsen der Seite selber. Bei Seiten die sich selten verändern und/oder einiges aus der Datenbank lesen (z.B. Artikel bei einem Portal, die geschrieben aber nicht mehr verändert werden), kann dies sehr viel Zeit sparen. Auch bei Anwendungen ohne Datenbank, oder wenn bei der Datenbank Caching eingesetzt wird, lässt sich noch mehr rausholen.
Beispiel an meinem Source Viewer: Das Skript liest eine Datei aus und lässt einige Male str_replace über die Ausgabe laufen, was einiges an Dauer frisst (mit Caching 10-100fach, merkt man aber im 0,x Sekunden Bereich eh nicht
).
Vorüberlegungen
Bei Datenbankabfragen war das bisher sehr einfach, da wir immer eine Variable hatten die wir einfach in eine Datei schreiben konnten. Doch wie soll man das bei anderen Dingen machen? Alles was irgendwie eine Ausgabe hat so umschrieben, dass es in eine Variable speichert?
Letzteres wär ne wirklich schlechte Methode, da sie sehr viel Zeit und noch mehr Arbeitsspeicher frisst. PHP bietet für diesen Fall einige sehr nete Funktionen, ich verweise jetzt einfach mal auf das PHP Manual Kapitel: Ausgabesteuerung.
Los geht’s!
Zuerst einmal weisen wir PHP an, alles was ausgegeben werden soll, einzufangen:
ob_start();
Kurz und schmerzlos
Als nächstes kommen die ganzen Ausgaben über echo und Co. Sobald diese vorbei sind, müssen wir den Ausgabepuffer abholen und können diesen dann beliebig verwenden.
$content = ob_get_clean();
Gut, wir haben die Ausgabe in einer Variable. Doch was jetzt? Beim Source Viewer lass ich z.B. alle Zeilenumbrüche und Tabulatoren entfernen:
1 2 3 | $content = str_replace("\n", '', $content); // Remove linebreaks $content = str_replace("\r", '', $content); // Remove linebreaks $content = str_replace(' ', '', $content); // Remove tabs |
Mit einem einfachen echo lässt sich dann die Ausgabe an den Besucher senden:
echo $content;
Lasst das Caching beginnen!
Ein Grundgerüst wie das Caching genau aussehen kann gibt es hier.
Zuerst müssen wir prüfen, ob es einen Cache gibt, falls ja wird dieser mittels readfile() ausgegeben und das Skript beendet. Falls nicht, kann die reguläre Seite erzeugt werden (wegen dem exit ist das else optional) und dann ins Dateisystem geschrieben werden.
Viel Spaß und Erfolg beim Nachmachen!