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 Datenbank Abfragen dar.
Die Suche nach geeigneten Lösungen der Optimierung von Ladezeiten und Performance sowie der Minimierung von Datenbank Abfragen für meinen Blog, war eine Odyssee, die mehrere Tage in Anspruch nahm.
Lösung durch mein PHP Cache Script für zu viele Datenbankanfragen
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 😉
Nun 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:
1 2 3 4 5 6 7 8 9 10 11 | <?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.
Zeilen um den Chache zu testen
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:
1 2 3 4 5 6 7 | <?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.
Wo kannst du das Cache Script verwenden?
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 bisschen 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:
1 2 | $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:
1 2 | <?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.
Geniale Themes: MyThemeShop | Vorteile: |
|
So kann man den Cache früher aktualisieren
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.
2 Kommentare zu WordPress Performance verbessern: PHP Cache Script für einzelne Datenbank Abfragen!