Flattr

Social

Plugins

Apps

Lab

Kategorien

6. Februar 2012 / Performance, WordPress

Cachify: Handliches Cache-Plugin für WordPress

Cachify ist das ausgereifte Cache-Plugin für WordPress, welches die Blog-Performance steigert und Datenbankanfragen minimiert. Kostenlos.
Cachify für WordPress

Mit zunehmender Anzahl an dynamischen Widgets, Templates und Plugins neigt ein WordPress-Blog dazu, träge zu werden. Unter Last des Besucheransturms häufen sich die Zugriffe auf die Datenbank, der Server hat durch die Abarbeitung flexibler Bereiche proportional mehr zu erledigen. Nicht ganz verzögerungsfreie Auslieferung der Webseiten ist das Resultat der Belastung. Speziell für Playground wurde Cachify entwickelt: einfaches Cache-Plugin, welches Seiteninhalte des Blogs in statischer Form zwischenspeichert und diese auf Anfrage Performance-schonend ausliefert. Mit APC als Option. Ideal für WordPress als CMS.

Sprungmarken

Cachify in WordPress Twenty Ten
Cachify-Plugin im Einsatz: Optimierungsergebnisse im Quelltext

Funktionsweise
Nach zahlreichen Testwochen und Verbesserungsrunden steht das Cache-Plugin Cachify kostenlos zur Nutzung bereit. Mit Sicherheit kann es mit vielfältigen WordPress-Plugins der Branche nicht mithalten, erfüllt jedoch seinen Zweck vollkommen und äußerst zuverlässig. Und das mit sehr minimalen Mitteln und überschaubarem Code.

Was macht also Cachify? Ruft ein Besucher oder ein eingeloggter Nutzer (ausgeschaltet als Default) eine Blogseite auf, prüft das Cache-Plugin, ob diese Seite bereits im Cache als statischer Quelltext vorliegt. Im Positivfall kommt die zwischengespeicherte Version der Seite zur Ausgabe. Andernfalls befördert die smarte Cache-Lösung den aktuellen Seiteninhalt in die Datenbank. Beim nächsten Aufruf der Seite im Browser würde diese also aus dem Cache eingelesen und direkt an den Browser gesendet.

Der Vorteil der Technik wird schnell klar: Statischer Inhalt liegt bereits für die Ausgabe vor und wird nicht erst durch unzählige Datenbankzugriffe und dynamische PHP-Scripte in die Ausgangsform zusammengeführt.

Zusätzlich profitiert auch die Ladezeit der Blogseiten, weil Webseiten prompter vom Server ausgeliefert werden. Im Testlabor konnte Cachify eine Reduzierung der Datenbankabfragen um 80 Prozent und die Ausführungszeit um bis zu 60 Prozent senken. Summa Summarum: Die Datenbank und der Server werden spürbar entlastet.

Das Beste an der Umsetzung ist die Tatsache, dass das Plugin keine eigenständige Funktionalität zur Cache-Verwaltung mitbringt, setzt also voll und ganz auf WordPress-interne Mittel (z.B. Transient API). Achtung: Die Speicherung des Cache erfolgt in der Datenbank.

Wichtig: Vor Inbetriebnahme
Da Cachify jede Blogseite (nicht im Admin-Backend) zwischenspeichert, muss sichergestellt werden, dass Seiten für jeden Nutzer gleich aussehen und nie nutzerspezifische Informationen (Hallo, Sergej) beinhalten. Also keine vorausgefüllten Formulardaten mit Nutzerwerten, keine Hinweise oder Meldungen (Ihr Kommentar befindet sich in der Moderation), da diese sonst im Cache landen (Zeitpunkte der Cache-Regenerierung weiter unten beachten) und ab dann für jeden Besucher in dieser Form ersichtlich sind. Geben das aktuell eingesetzte Theme und/oder die WordPress-Einstellungen diese Voraussetzungen nicht her, darf Cachify ohne Anpassungen nicht aktiviert werden. Daher erst prüfen, dann aktivieren (oder das Plugin bzw. Theme erweitern).

Cache-Reset: Automatisch und manuell
Das Skript ist mit notwendigsten Hooks ausgestattet: Änderungen an Kommentaren bewirken einen Neuaufbau des Cache für die betroffene Blogseite. Nach neu angelegten oder modifizierten Beiträgen leert Cachify den kompletten Cache, da nach der Veröffentlichung zu viele Veränderungen bzw. Verschiebungen innerhalb der Archivseiten zu erwarten sind. Ein effizenteres Management würde die Komplexität der Cache-Lösung steigern.

Ebenfalls zugunsten der Übersichtlichkeit und der Einfachheit des Codes stossen selten ausgeführte Element-Aktionen wie beispielsweise neu angelegte Kategorien, Tags und andere Post-Typen keinen Cache-Refresh an. Bei Bedarf das Skript erweitern oder die Cachify-Schaltfläche Cache leeren in der Admin Bar betätigen – daraufhin wird der aufbewahrte Zwischenspeicher (in der Datenbank und soweit aktiviert im APC) eliminiert, mit der Neuindexierung der Daten wird begonnen. Netzwerkweit aktiviertes Plugin leert in diesem Fall den Cache aller Multisite-Blogs.

Cachify Toolbar Icon

WordPress Cache leeren bequem in der WordPress Toolbar

Optimierungswerte: Davor, danach
Um den Performance-Gewinn zu ermitteln, speichert das Plugin im Cache zusätzlich zum Seiteninhalt die Anzahl der Datenbankanfragen und die verbrauchte WordPress-Ausführungszeit (nicht zu verwechseln mit der Ladezeit im Browser). Beim Auslesen der Daten aus dem Zwischenspeicher werden diese Angaben den aktuellen Werten gegenübergestellt und im Browser-Quelltext abgebildet (siehe dazu den Screenshot oben).

Cachify Einstellungen
In der Standard-Ausführung des Cachify verfällt der gespeicherte Cache einer Blogseite automatisch nach zwölf Stunden. Diese wie andere Einstellungsmöglichkeiten sind auf der Plugin-Optionsseite nach Wünschen und Gegebenheiten frei veränderbar. Nach dem Speichern der Optionen leert sich der Cache und vorgenommene Einstellungen beginnen mit ihrer Wirkung. Nachfolgend werden einzelne Plugin-Optionen erklärt.

WordPress Cache Optionen
Ab Cachify 1.0: Gestaltete Optionsseite

Cache-Gültigkeit in Stunden
Aufbewahrungsdauer des Cache in Stunden. Bei CMS-Seiten lohnt sich eine Zahl im Monatsbereich. Bei aktiviertem APC-Cache bedeutet eine eingetragene 0 (Null) einen unbefristet gültigen Cache.
12 ist als Standard definiert.

Ausnahme für (Post/Page) IDs
Erweiterung der Ausnahmeliste für einzelne Blogseiten. Eine Komma-separierte Liste an Post- und/oder Page-IDs, die vom Cache ausgeschlossen werden sollen.
Beispiel: 1, 2, 3

Ausnahme für User Agents
Erweiterung der Ausnahmeliste für einzelne Browser. Komma-separierte Liste der User Agents (gerne nur der wesentliche Teil des Strings), die vom Cache ausgeschlossen werden sollen.
Beispiel: MSIE 6, Opera

Komprimierung der Ausgabe
Komprimierung (Minification) der HTML-Ausgabe. Überflüssige Zeichen wie Umbrüche und HTML-Kommentare werden entfernt.
“Aus” ist als Standard definiert.

Nur für nicht eingeloggte Nutzer
In aktivierter Form sorgt die Checkbox dafür, dass alle Blogleser ausgenommen eingeloggte Nutzer den Cache initialisieren dürfen und die zwischengespeicherte Version einer Blogseite angezeigt bekommen. Praktisch, wenn angemeldete Blog-Autoren und Administratoren beispielsweise die integrierte Admin-Bar oder Editieren-Links im Theme eingeblendet bekommen, die gewiss nicht zum Bestandteil des Cache werden sollen. “Kein Haken” als Wert bedeutet, angemeldete Nutzer sehen identische Ausgabe wie gewöhnliche Besucher der Seite (es wird also nicht unterscheiden und alle sehen alles gleich).

Bei aktiviertem APC-Cache spielt die Option keine Rolle, da an der betroffenen Cache-Ausgabestelle keine WordPress-Rollen verfügbar sind.
“An” ist als Standard definiert.

APC (Alternative PHP Cache) nutzen
Ist APC als PHP-Erweiterung auf dem Server installiert (apc >= 3.1.4), so steht im Cache-Plugin automatisch eine Zusatzoption zur Aktivierung bzw. Nutzung des APC bereit. Nach der Aktivierung legt Cachify die generierten HTML-Ansichten der aufgerufenen Blogseiten im Cache (Shared Memory) der PHP-Extension ab und benötigt beim Aufruf der Seiten keinerlei Datenbankanfragen sowie dynamische PHP-Befehle. Durch einen direkten Aufruf der Blogseiten aus dem Cache ist die Reaktions- und Rückgabezeit des Servers sehr schnell.

Für den geplanten Zugriff auf den APC-Zwischenspeicher wird auf dem Server eine Proxy-Plugin-Datei – liegend unter cachify/apc/proxy.php – eingebunden, welche den Cache-Vorrat auf die Existenz der aktuell aufgerufenen Webseite analysiert und im Erfolgsfall direkt an den Browser sendet. Dabei speichert Cachify die Ausgabedateien in GZIP-komprimierter Form, so dass keinerlei Prozesse für zusätzliche Komprimierungen und DEFLATE-Vorgänge notwendig sind. Das Caching-Plugin übernimmt die Kompression und die korrekte Ausgabe an den Server. Prozessor- und Speicherplatz-schonend.

Die Einbindung der Proxy-Datei unterscheidet sich je nach Webserver. Im Grunde handelt es sich um einen auto_prepend_file Aufruf für PHP-Dateien, welcher je nach Möglichkeit in der php.ini oder .htaccess eingebunden wird.

Beispiel für .htaccess:

<Files index.php>
  php_value auto_prepend_file /pfad/plugins/cachify/apc/proxy.php
</Files>

Beispiel für nginx-Instanzen:

location ~ \.php {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param PHP_VALUE auto_prepend_file=/pfad/plugins/cachify/apc/proxy.php;

    location ~ /wp-admin/ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param PHP_VALUE auto_prepend_file=;
    }
}

Die Dateieinbindung dieser Art umgeht die zeitraubende Ausführung des nicht ganz “leichten” WordPress-Cores und spart alle Datenbankzugriffe ein. Schöner Nebeneffekt: Der WordPress-Code bleibt unberührt und ist nach wie vor Upgrade-fähig.

Interne Ausnahmeliste (Bereiche, die vom Cache ausgenommen sind)

  • Passwort-geschützte Seiten
  • Feeds
  • Trackbacks
  • Robots
  • Vorschau
  • Mobile-Themes (WP-Touch & Carrington)

Hinweise

  • Mindestvoraussetzungen des Cache-Plugins: WordPress ab 3.0 und PHP 5.
  • Beim Deinstallieren entfernt Cachify den Cache aus der Datenbank.
  • Es ist mit einem Zuwachs der Datenbankgröße zu rechnen.
  • Ist hier im Playground im produktiven Einsatz (mit APC).
  • Nach der Inbetriebnahme sind Blogseiten auf Fehlerfreiheit zu überprüfen.

Schlusswort
Die Dimension des Blogs mit eingesetztem Cache-Plugin ist sekundär: Das Ziel ist immer, die Datenbankanfragen und PHP-Ausfürungen zu reduzieren, um den Server zu entlasten und die Anzeige-Geschwindigkeit zu beflügeln.

Versionsverlauf
Version 1.5.1 vom 6.2.2012

  • APC Proxy: zlib.output_compression = Off für Apache Webserver

Version 1.5 vom 14.01.2012

  • Code-Formatierung
  • Veränderung des Toolbar-Buttons “Cache leeren”
  • Überarbeitung des regulären Ausdrucks für die HTML-Komprimierung

Version 1.4 vom 23.12.2011

Version 1.3 vom 20.12.2011

Version 1.2.1 vom 01.12.2011

  • Icon für die Admin Bar

Version 1.2 vom 21.11.2011

  • Cache leeren Schalter für die Adminbar
  • Testbetrieb unter WordPress 3.3
  • Verknüpfung mit wpSEO (Cache-Leerung bei Optionsänderungen)

Version 1.1 vom 16.08.2011

  • Automatische Prüfung auf eventuelle Fehlgenerierungen
  • Modifizierung der Code-Struktur
  • Eliminierung der Inline-Hilfe (oben rechts)
  • Verknüpfung der Online-Hilfe mit einzelnen Optionen

Version 1.0 vom 21.06.2011

  • Leerung des Cache beim Aktualisieren von statischen Seiten
  • Seite mit Plugin-Einstellungen
  • Inline-Dokumentation innerhalb der Optionsseite
  • Ausschluss von Passwort-geschützten Seiten
  • WordPress 3.2 Support
  • Unterstützung der WordPress Multisite Blogs
  • Umstellung auf den template_redirect-Hook (Plugin-Kompatibilität)
  • Interne Code-Bereinigung

Version 0.9.2 vom 17.05.2011

  • HTML-Komprimierung durch Entfernung unnötiger Leerräume
  • Flattr-Link

Version 0.9.1 vom 27.01.2011

  • Cache-Reset bei geplanten Beiträgen
  • Unterstützung für das Carrington-Mobile Theme

Version 0.9 vom 14.01.2011

  • Workaround für Redirects

Version 0.8 vom 11.01.2011

  • Blacklist für PostIDs
  • Blacklist für UserAgents
  • Ausnahme für WP Touch
  • Ausgabe des Zeitpunktes der Generierung
  • Umbenennung der Konstanten

Version 0.7 vom 10.01.2011

  • Davor, danach: Ausgabe des Speicherverbrauchs

Version 0.6 vom 09.01.2011

  • Live auf wordpress.org

Installation

  • Plugin downloaden
  • Via FTP oder WordPress-Backend zu den Plugins hinzufügen
  • Reiter Plugins aufrufen
  • Plugin Cachify aktivieren
  • Obere Dokumentation beachten
  • Einstellungen vornehmen

Flattr
Unterstützung via Flattr ist jederzeit willkommen. Danke.

Download
› Cachify – Cache für WordPress ↓

Sergej Müller

[Der Autor]Sergej Müller ist enthusiastischer Software Engineer mit Schwerpunkten Webentwicklung, Apps und WordPress. Seit 2007 programmiert und vertreibt er wpSEO, das zugkräftige SEO-Plugin für WordPress-Blogs.