PHP Cache Script für einzelne Wordpress Datenbank Abfragen

Ein einfaches PHP Script, welches den Cache für einzelne Wordpress Datenbank Abfragen ermöglicht, und zudem manuell an diversen Stellen des Themes einzupflegen ist, stellt die Lösung zur Reduzierung meiner vielen Datebank Abfragen dar. Wie ja bereits gestern im ersten Teil dieser kleinen Beitragsreihe zur Optimierung von Ladezeiten und Performance sowie der Minimierung von Datenbank Abfragen erwähnt, war die Suche nach einer geeigneten Lösung für meinen Blog eine Odyssee, die mehrere Tage in Anspruch nahm.

Meine Beitragsverlinkungen, die ich entweder via Plugins oder Wordpress Template Tags in mein Theme eingepflegt habe, erzeugen haufenweise Datenbank Abfragen, so dass ich summa sumarum auf der Startseite auf ca. 150 Datenbank Abfragen und im einzelnen Beitrag auf ca. 180 Datenbank Abfragen kam. Diese konnte ich nun mittels eines PHP Cache Scripts auf im optimalsten Fall 38 (Startseite) und 50 (Beitrag) Datenbank Abfragen senken. Dass eine solche Reduzierung auch bessere Ladezeiten und Performance mit sich bringt, ist klar ;-)

An dieser Stelle möchte ich mich recht herzlich bei Markus Tacker bedanken, der mir 2 ausführliche englische Tutorials raussuchte, die mir erklärten, wie ich eine PHP Cache Lösung in meinem Theme für die entsprechenden Wordpress Datenbank Abfragen implementieren könnte.

Nun aber zum PHP Cache Script, das aus zwei Teilen besteht. Der erste Teil muss vor dem zu cachenden Teil eingefügt werden, der zweite Teil danach. Wenn Du dieses PHP Cache Script ebenfalls für Deinen Wordpress Blog implementieren möchtest, benötigst Du einen beschreibbaren Ordner (chmod 777) auf Deinem Server, den Du am besten direkt im Hauptverzeichnis Deines Blogs anlegst (dort wo auch die Ordner wp-admin etc. sind).

Danach öffnest Du die entsprechende Datei Deines Themes (z.B. sidebar.php) und gibst direkt vor dem zu cachenden Teil (z.B. dem Plugin Aufruf Popular Posts <?php popular_posts(); ?>) folgenden PHP Script Code ein:

<?php $cachefile = "ordner/dateiname.html";
$cachetime = 1440 * 60; // 24 Stunden
if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) {
	include($cachefile);
	$test = date('j. F Y H:i', (filemtime($cachefile) + $cachetime));
	echo "<!-- Cache vom ".date('j. F Y H:i', filemtime($cachefile))." - naechster Update: $test-->";
} else {
	ob_start(); ?>

In der ersten Zeile definierst Du Deine Datei, in die der Cache geschrieben werden soll. In der zweiten Zeile die Zeit, wie lange der Cache gelten soll. Danach folgt eine Abfrage, die nachsieht, ob die Cache Datei bereits existiert und noch aktuell zu verwenden ist. Falls ja, wird die Cache Datei eingefügt.
Die nächsten beiden Zeilen ($test und echo) habe ich nur zum Test eingefügt. Falls die Cache Datei eingefügt wird, wird im Quellcode eine Zeile ausgegeben, die angibt, von wann der Cache ist und wann der nächste Cache generiert wird. Sobald meine Tests erfolgreich abgeschlossen sind, deaktiviere ich diese beiden Zeilen (dazu einfach // davor einfügen).
Die nächsten Zeilen im PHP Cache Script sind zum Beenden des Einfügens der Cache Datei und definieren, dass, falls keine Cache Datei gefunden wurde oder die Cache Zeit abgelaufen ist, eine PHP Funktion aufgerufen wird, die alles Folgende in einen Puffer zwischenspeichert.

Danach kommt Dein zu cachender Teil. Nach diesem fügst Du den zweiten Teil des PHP Cache Scripts ein:

	<?php $fp = fopen($cachefile, 'w');
	fwrite($fp, ob_get_contents());
	fclose($fp);
	ob_end_flush();
} ?>

Hier wird Deine im ersten Teil definierte Cache Datei erstellt bzw. geöffnet und der zwischengespeicherte Puffer, also Dein zu cachender Teil, hineingeschrieben und im Anschluss daran wird das PHP Cache Script beendet.

Das wars dann auch schon, mehr ist nicht nötig, um Wordpress Datenbank Abfragen mit einem PHP Script zu cachen. Dieses PHP Cache Script kannst Du beliebig oft in Deinem Theme Dateien einsetzen, solltest aber dabei darauf achten, dass Du jedesmal eine andere Cache Datei wählst und ggf. auch die Variablen $cachefile und $cachetime anders benennst (damit es nicht zu Überschneidungen kommt). Ich habe meine gesamte Footer Verlinkung in ein PHP Cache Script gesetzt, in der Sidebar verwende ich mehrere PHP Cache Scripte, da ich auch unterschiedliche Anzeigen auf diversen Seiten ausgebe. Ich cache aber bei weitem nicht alles, sondern nur die neuesten Beiträge und die popular posts (meine Créme de la Créme). Alles andere erzeugt nur wenig Datenbank Abfragen und wird deswegen nicht mit einem PHP Cache Script versehen. Man muss es ja auch nicht übertreiben damit ;-)

Weiter habe ich das PHP Cache Script auch noch für die similar posts in meiner single.php eingesetzt. Hier gibt es aber noch ein bißchen was zusätzlich zu beachten, da die similar posts ja für jeden Beitrag unterschiedlich sind und somit auch unterschiedliche Cache Dateien geschrieben werden müssen. Dafür habe ich in meinem Cache Ordner einen beschreibbaren Unterordner angelegt und die erste Zeile aus dem ersten Teil des PHP Cache Script ($cachefile…) mit folgenden 2 Zeilen ersetzt:

$teil = basename($_SERVER['REQUEST_URI']);
$cachefile = "ordner/unterordner/".$teil;

In der ersten Zeile wird der Dateiname des einzelnen Beitrages abgefragt und in der zweiten Zeile zu meinem Ordner und Unterordner hinzugefügt.

Da $_SERVER['REQUEST_URI'] nicht auf allen Servern die gleiche Ausgabe produziert, solltest Du die Ausgabe erst einmal überprüfen, bevor Du sie verwendest. Dazu einfach kurz irgendwo in Deinem Theme die folgenden zwei Code-Zeilen einfügen, einen Beitrag öffnen und im Quelltext die Ausgabe überprüfen:

<?php $jetzt = basename($_SERVER['REQUEST_URI']);
echo "<!-- $jetzt -->"; ?>

Mit <?php echo "<pre> ".print_r( $_SERVER, true )." </pre> "; ?> kannst Du Dir auf dem Bildschirm Deine speziellen Variablen ausgeben lassen und dann ggf. REQUEST_URI mit der bei Dir passenden ersetzen.

Sollte ich mal einen Cache aus irgendeinem Grund früher aktualisieren wollen, gehe ich in das entsprechende PHP Cache Script und ändere die Cachezeit entsprechend ab. Hochladen, zwei mal aktualisieren (beim ersten mal wird die Cache Datei geschrieben, beim zweiten Mal reingeholt) und fertig. Danach kann ich die Cachezeit wieder hochsetzen. Damit so etwas nicht dauerhaft zu viel Arbeit führt, sollte man sich schon genau überlegen, was gecached werden soll und wie die entsprechende Cachezeit im PHP Cache Script definiert wird.

Bleib auf dem Laufenden und abonniere meinen RSS Feed Crazy Girls RSS Feed jetzt abonnieren
|
 Autor: Crazy Girl |
 Themenbereich: Bloggen
Trackback URL: http://www.crazytoast.de/php-cache-script-wordpress-datenbank.html/trackback/
Ähnliche Beiträge:
↑ Ganz nach oben springen ↑
↓ zum kommentieren springen ↓
14 Reaktionen:
3 Trackbacks:
  1. [...] WordPress PHP Cache Script [...]

  2. [...] über eine Sitemap. Das Ganze ohne Plugin. Wenn Ihr wollt, könnt Ihr Euch die Ausgabe auch nach Tanjas Methode cachen – das schont den Server und spart  etwas [...]

  3. [...] Doch so richtig funktioniert hat nichts von alledem. Da erinnerte ich mich an Tanja, die mit Ihrem Cache-Skript so allerlei Anwendungsmöglichkeiten aufzeigte. Das Skript kann, in jeweils abgewandelter Form, [...]

11 Kommentare:
  1. hombertho schrieb am 19. April 2009 um 19:22 Uhr:
    # 1

    Wow Tanja,
    ich sehe du hast deine Hausaufgaben wieder mal gründlich gemacht. Ich bin beeindruckt. Bei Gelegenheit werde ich dass auch mal mit dem PHP Cache ausprobieren.
    Viele Dank für die Ausführliche und tolle Beschreibung :-)
    Viele Grüße
    Thomas

  2. Crazy Girl antwortete am 20. April 2009 um 08:43 Uhr:
    # 2

    Danke Thomas! War schon eine ganz schöne Arbeit, aber für das Ergebnis hat sich das alles auf jeden Fall gelohnt :-)

  3. Markus schrieb am 20. Dezember 2009 um 20:35 Uhr:
    # 4

    Du kann es sein das ab einer bestimmten Anzahl der zu includierenden Dateien das ganz ins negative umschläg und langsamer wird. Hab es jetzt grad aktuell für meine Vorschaubilder eingebaut funktioniert wunderbar. Doch anstatt 2,8 sec zeigt mir Pingdom Tools nun ca 4,8 sec an. :-(

  4. Crazy Girl antwortete am 21. Dezember 2009 um 13:31 Uhr:
    # 5

    @Markus: Ich habe es ja auch mehrfach eingebunden (sidebar mehr als 1x, footer und die ähnlichen beiträge) und konnte das nicht so feststellen.

  5. Markus schrieb am 21. Dezember 2009 um 13:50 Uhr:
    # 6

    Auf manchen Seiten sind es halt um die 35 includes die abgefragt werden bei mir. Irgendwie schwanken die Zeitangabe gerade arg. Ich werd das jetzt mal ein paar Tage verfolgen. Danke Dir.

  6. Crazy Girl antwortete am 21. Dezember 2009 um 14:20 Uhr:
    # 7

    @Markus: Bei so vielen kann es schon sein, dass die Ladezeiten nach hinten losgehen. Lieber etwas größere Bereiche in den Cache packen.
    Die drei Boxen die Du bei mir unten im Footer z.B. siehst, sind alle gemeinsam in einem Cache bei mir.

  7. Markus schrieb am 21. Dezember 2009 um 14:44 Uhr:
    # 8

    In einen Bereich packen geht halt leider dort nicht. Aber eigentlich macht es mir momentan nicht viel aus. Ich denke wenn ich dadurch erreiche das die Ladezeiten gleich bleiben, egal ob 1000 Besucher am Tag oder 5000 Besucher, würde mir das schon was bringen. Da ist eine halbe Sekunde unterschied, wie es momentan ist, denk ich zu vernachlässigen, wenn das ganze dafür stabil bleibt auch an besuchsstarken Tagen. Wie gesagt ich werd das jetzt paar Tage beobachten und dann ein Fazit ziehen.

  8. Crazy Girl antwortete am 21. Dezember 2009 um 17:14 Uhr:
    # 9

    @Markus: Ja, beobachen und dann entsprechend handeln ist das Beste. Ich habe diese Caches damals ja aus ein bißchen anderen Gründen entwickelt. Finde es einfach sinnlos, dass bei jedem Seiteinaufruf immer das Gleiche aus der Datenbank geholt wird mit vielen unterschiedlichen Datenbankabfragen. Ändert sich ja nur einmal täglich oder gar noch seltener. Warum dann immer jedesmal neu abfragen…

  9. Marc schrieb am 2. September 2010 um 22:32 Uhr:
    # 12

    …bin mal wieder hier gelandet :-)
    Sag mal, wird bei dir auch der eigentliche Artikel gecacht, oder hast du damit keine Vorteile bemerkt (falls getestet)?

  10. Marc schrieb am 2. September 2010 um 23:47 Uhr:
    # 13

    PS: Bzgl. des aktualisierens habe ich es mir einfach gemacht – als eingelogger User bekommt man nie einen Cache:


    if (( !is_user_logged_in() ) && file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) {

  11. Crazy Girl antwortete am 3. September 2010 um 07:16 Uhr:
    # 14

    @Marc: Hier cache ich auch die eigentlichen Artikel. Hatte mich irgendwann dazu entschieden, weil ich ja eh schon die Similar Posts cache für jeden Artikel. Ob nun nur diesen Bereich oder den ganzen Artikel selbst, ist ja eigentlich Banane.
    Nur die Kommentare sind (noch) ausgenommen. Eine Weile habe ich sie auch extra gecacht und das war eigentlich ganz gut. Doch dann sind immer mal wieder Fehler im System aufgetaucht, die zwar nix mit dem Cachen zu tun hatten, aber ich das Cachen ausschalten musste, um den Fehlern auf die Schliche zu kommen. (z.B. damals das mit den Trackbacks, das war ja erst ne Suche nach der Nadel im Heuhaufen). Danach habe ich das ein oder andere einfach nicht mehr angeschaltet. Faulheit? K.A. ;-)

Einen Kommentar dazu schreiben:

Bitte beachtet die Datenschutzhinweise sowie zu Spammer Kommentaren.

Ich behalte mir das Recht vor, Kommentare entsprechend zu löschen oder editieren!

Kommentare mit Links, die nicht zu Blogs führen und/oder Keywords
als Namen verwenden sind nicht erwünscht und werden gelöscht!


Links beinhalten das rel=nofollow Attribut (Stammkommentatoren ausgeschlossen)!

Kommentare abonnieren ohne selbst einen Kommentar abzugeben: