Webdesign, WordPress Programmierung, Online und Social Media Marketing - Dienstleistungen & Blog
Ein einfaches PHP Script, welches den Cache für einzelne Teile der Website, wie z.B. WordPress Datenbank Abfragen, ermöglicht, und zudem manuell an diversen Stellen einzupflegen ist, stellt die Lösung zur Performance Verbesserung dar. Bei der Optimierung der Performance haben auch Datenbankabfragen einen Einfluss auf die Ladezeit. Und wer kein Cache Plugin nutzen will oder kann, der möchte vielleicht auf eine manuell einzupflegende Lösung, ein individuelles PHP Cache Script zurückgreifen. Dieses Cache Script habe ich bereits in 2009 erstellt und es läuft auch heute noch auf einigen meiner Projekte.
Als ich dieses Script damals zusammen bastelte ging es mir um erster Linie und die Performance Verbesserung der WordPress Datenbankabfragen, die so einige Plugins und auch manuelle Lösungen in meinen Blogs verursachen. Damals konnte ich die Datenbank Abfragen von ca. 200 auf unter 50 pro Seitenaufruf verringern. Dass dies eine Performance Verbesserung mit sich bringt liegt auf der Hand.
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 für mich 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 Datenbankabfragen oder einen beliebigen Teil einer Website mit einem PHP Script zu cachen. Dieses PHP Cache Script kannst Du beliebig oft in Deinen 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).
Weiter habe ich das PHP Cache Script oft auch für die similar posts in der 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.
Ein einzelnes Cache Script wie dieses trägt zwar auch schon ganz gut zur Peformance Verbesserung bei, aber es lässt sich nicht mit einem Cache Plugin vergleichen. Wer aber dennoch ein solches nicht nutzen möchte bzw. kann, dem mag mit einem PHP Cache Script wie diesem durchaus geholfen sein. Abgesehen davon gibt es ja nicht nur WordPress und andere Systeme haben vielleicht keine so einfachen Lösungen wie die WordPress Plugins.
HTML, PHP und CSS Kommentare, bzw. einzelne Codes deaktivieren - In HTML, PHP wie auch in CSS gibt es die Möglichkeit Kommentare einzufügen, die auf der Webseite selbst nicht zu sehen sind. Solche Kommentare ermöglichen dem Betreiber bzw. Webdesigner seine [...]
Bei all-inkl.com Datenbanken via PHP Skript und Cronjob sichern - All-inkl.com bietet auf seinen Seiten ein PHP Script an, mit dem die WordPress Datenbank sowie natürlich auch alle anderen Datenbanken ganz einfach gesichert werden können. Um das Ganze zu automatisieren [...]
Random Posts – zufällig ausgewählte Artikel ohne Plugin anzeigen - Eine Version für die Verbesserung der internen Verlinkung ist die Anzeige von zufällig ausgewählten Artikeln – random posts – in der Sidebar des Blogs. Um die random posts anzeigen zu [...]
WordPress Artikelbild als Bild zum Link in Google Plus ausgeben - Wie kriege ich Google Plus dazu mein WordPress Artikelbild als Bild zu meinem Link auszugeben? Eine Frage mit der ich mich 2 Tage beschäftigte, denn Google Plus wollte meine Artikelbilder, [...]
Meta Description und Keywords über WordPress benutzerdefinierte Felder - Da ich persönlich kein SEO Plugin in meinen Blogs benutze, muss ich für die notwendigen Dinge auf WordPress Funktionen oder eigens programmierte Lösungen zurückgreifen. So auch für die Meta Description [...]
Hallo Tanja,
ich musste natürlich (!)
auch diese Scripte in meinem Blog einbauen, da ich ebenfalls nicht so der Cache-Plugin-Fan bin. GTmetrix und Page Speed zeigen mir zwar oftmals bessere Werte an, aber meines Erachtens lädt die Seite teilweise sogar langsamer.
Also hab’ ich glatt mal Deine Cache-Methode angetestet. Eingebaut habe ich es bei den letzten Trackbacks, den beliebtesten Artikeln in der Sidebar und ähnlichen Beiträgen in der single.php.
Nun habe ich ja Dein tolles Plugin “Blogroll Widget with RSS Feeds” installiert und habe hierfür das 2. von den ersten beiden Scripten in der page.php verwendet. Allerdings habe ich die Zeit verkürzt auf 360 * 60.
Jetzt bin ich ja echt mal gespannt, ob das ein bisschen was an Geschwindigkeit bringt. Der Cache-Ordner und Unterordner sind auf jeden Fall schon mal gefüllt.
Lieben Gruß
Sylvi
@Sylvi: Ein bißchen was müsste es in jedem Fall bringen. Beim Blogroll Widget auch einiges mehr.
Als ich mal testweise mit den Scripten die Kommentare cachte wurde mein Blog unterm Strich auch langsamer. Das hat mir gezeigt, dass viel cachen auch mal zuviel des Guten sein kann. Deswegen konzentriere ich mir vor allem auf Bereiche, die viele Datenbankabfragen produzieren, z.B. in Sidebar und Footer.
Subjektiv habe ich den Eindruck, dass das Cachen der Blogroll-Seite was gebracht hat und diese nun wesentlich schneller lädt als vorher.
In der Vergangenheit hatte ich eben gerade mit den Cache-Plugins die Erfahrung gemacht, dass oft die Kommentarfunktion darunter gelitten hatte. Kommentatoren wiesen mich darauf hin, dass sie teilweise ihre abgesendeten Kommentare gar nicht sofort sehen konnten. Daher bleibt diese Funktion bei mir auch außen vor.
@Sylvi: Ich denke da nicht nur an die Kommentare, sondern auch an die verschiedensten Buttons, Zähler etc. Das stimmt doch dann alles hinten und vorne nicht mehr, oder irre ich?
Da kann ich leider nicht aus Erfahrung sprechen. Den einzigen Zähler, den ich eine Zeit lang verwendet hatte, war der von Feedburner. Und dessen Anzeige schwankte so enorm (auch ohne Cache) und war in meinen Augen sowas von unrealistisch, dass ich ihn wieder herausgeschmissen habe.