Für Menschen · Seien Sie begeistert und Sie werden begeistern !
WordPress besitzt einen internen Cache, der auch für Erweiterungen genutzt werden kann. Dazu stehen diverse Funktionen bereit und man muss keine eigenen Ideen verwirklichen, sondern kann die Cache-Funktionalität von WordPress einfach nutzen.
Um die Funktionen kennen zu lernen und ein wenig zu verstehen eignet sich ein kleines aber verständliches Beispiel am besten und daher cache ich im folgendem Tutorial einen Feed, der im Frontend ausgegeben werden soll.
Alle Funktionen des Cache sind im Codex von WordPress gelistet, so dass ein Blick in den Codex lohnt, wenn man sich mit der Syntax beschäftigt.
Die erste Cache Lösung kam mit WordPress 2.3 und war dateibasierend. Der Cache war optionale und konnte über einige Parameter konfiguriert werden, siehe Artikel WordPress Cache kontrollieren.
Aktiviert wurde er über die folgende Konstante: define('ENABLE_CACHE', true);
Der größte Sprung in der Vergangenheit zum Thema cache fand mit Version 2.6 statt, in der man den Cache auf eine objektorientierte Lösung geändert hat. Damit liegen die Möglichkeiten der Cache-Nutzung eher auf Seiten des Servers und nicht explizit auf Seiten von WordPress. Dies wurde vor allem realisiert, um die größtmöglichen Ressourcen aus dem Server zu schöpfen und nicht an WordPress zu übergeben. Mit dieser Einführung muss der Cache von WordPress auch nicht mehr explizit aktiviert werden, er ist immer aktiv. Daher ist es aber wichtig, dass der Server über ein gewisses Mindestmaß an RAM verfügt, dabei setzt WordPress 32 MByte voraus - ABER, dass ist nicht immer so und so ist beispielsweise beim Updaten des Core ein Aufruf enthalten, der den RAM auf 128MByte definiert, was in vielen Fällen nicht vorhanden und ist und damit klappt das Update nicht.
Aber darum soll es hier nicht gehen, denn ich will ja erklären, wie man den Cache in eigenen Erweiterungen nutzen kann. Also zurück zur Syntax und ich starte einfach mal mit den wichtigsten Funktionen um unser kleines Beispiel zu realisieren.
Alle Funktionen finden sich in wp-includes/cache.php, alternativ im Codex nachlesen.
Um den Cache neu zu setzen, insofern es keine Daten zu diesem Schlüssel gibt, dient die folgenden Funktion.
/**
* @param int|string $key The cache ID to use for retrieval later
* @param mixed $data The data to add to the cache store
* @param string $flag The group to add the cache to
* @param int $expire When the cache data should be expired
*/
wp_cache_add($key, $data, $flag = '', $expire = 0)
Um Cache-Daten zu einem Schlüssel zu löschen, gibt es das Gegenstück.
/**
* @param int|string $id What the contents in the cache are called
* @param string $flag Where the cache contents are grouped
* @return bool True on successful removal, false on failure
*/
wp_cache_delete($id, $flag = '')
Das Holen von Daten zu einem Schlüssel geschieht mit Hilfe von:
/**
* @param int|string $id What the contents in the cache are called
* @param string $flag Where the cache contents are grouped
* @return bool|mixed False on failure to retrieve contents or the cache
*/
wp_cache_get($id, $flag = '')
Soll innerhalb des Cache zu einem Schlüssel der Inhalt ersetzt werden, dann kommt die nachfolgenden Funktion ins Spiel.
/**
* @param int|string $id What to call the contents in the cache
* @param mixed $data The contents to store in the cache
* @param string $flag Where to group the cache contents
* @param int $expire When to expire the cache contents
* @return bool False if cache ID and group already exists, true on success
*/
wp_cache_replace($key, $data, $flag = '', $expire = 0)
Nun aber ein kleines Beispiel, welches den Feed cacht. Der Feed wird mittels fetch_rss() geladen, eine Funktion von WordPress die schon seit Version 1.5 vorhanden ist.
$mycache = wp_cache_get( 'mycache' ); // hole Daten aus dem Cache zu Schlüssel "mycache"
if ($mycache == false) { // wenn es keine Daten gibt, dann
$mycache = fetch_rss("http://mycache.com/feed/"); // feed parsen
wp_cache_set( 'mycache', $mycache ); // feedinhalt zum Schlüssel "mycache" abspeichern
}
var_dump( $mycache ); // Inhalt ausgeben
Ein Hinweis noch: einen Einblick in den Cache von WordPress bekommt einfach via der Variable $wp_object_cache oder mit Hilfe der Plugin Debug Objects oder WP Cache Inspect; wobei Debug Objects explizit dafür gemacht wurde und nur für Entwicklungsumgebungen genutzt werden sollte.
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 980 Beiträge, 18722 Kommentare in 14 Kategorien und 464 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
15. August 2009 um 12:17
wie lange befindet sich das object im cache? Gibt es ein timeout oder muss das object händisch aus dem cache entfernt werden?
was passiert, wenn nicht mehr genug speicher für das object zur verfügung steht? Wird dann das älteste object aus dem cache gelöscht oder ist das cachen für das aktuelle object nicht mehr möglich?
15. August 2009 um 13:16
So weit ich weiß, gibt es keinen Timeout, den muss man extra definieren, via Wert in der options. Das Object im Cache kann man mit Hilfe einer Funktion, siehe Artikel entfernen. Reicht der Speicher nicht, dann wird es nicht angelegt; es gibt keine Funktion für diesen Fall.
15. August 2009 um 19:28
Hallo Frank,
leider habe ich von Programmieren keine Ahnung und schätze Deine Tipps immer sehr. Die Sache mit dem Cache funktioniert bei mir aber einfach nicht. Habe den ganzen Tag gebastelt und gesucht und bin einfach nur verwirrt. Ein paar Fragen auf einmal (WP 2.8.4, PHP 5, Linux, Hosteurope):
a) Im Codex steht "define('WP_CACHE', true);"?
b) Ich nutze Dein Plugin zur Kontrolle des Caches. Sowohl hinter Warm Cache als auch Cold Cache steht nichts. Dafür Cache Misses: 236 oder andere Werte, je nach Seite.
c) Im Verzeichnis /wp-content/cache wird nichts abgelegt. Wohl aber ein Ordner "mo" dessen Inhalt ich nicht anzeigen kann
d) An einigen Stellen habe ich gelesen, das wäre nur bis 2.5?
Vielleicht hast Du einen Moment Zeit die Verwirrung zu lösen?
16. August 2009 um 10:43
Hi,
danke für den Beitrag. Habe das nun in mein Plugin Comment Counter eingebaut. Jedoch ist das etwas komisch.
Vorgang:
Es wird gezählt wie viele Kommentare ein Kommentator geschrieben hat und dann in den Cache eingetragen.
Sollte der selbe Kommentator nochmal auf der Seite geschrieben hat, wird die Zahl aus dem Cache geholt. Alles ok soweit.
Jetzt habe ich
$expiremal auf 10 Minuten gestellt.Die Seite wird geladen und die Zahlen in den Cache geladen. Dann aktualisiere ich die Seite, aber es werden dann nicht die Daten aus dem Cache geladen, sondern es scheint, als wäre er wieder gelöscht worden. Kann es sein, dass WordPress den Cache vor Seitenaufruf wieder löscht?
Zur Verdeutlichung kannst du dir das hier mal ansehen. Mit der Maus über den Namen fahren, kommt ein cache ist es aus dem Cache geladen.
Gruß Dominik
16. August 2009 um 11:37
@
DanielDominik: ich kann nicht so richtig folgen. Lese mal den Cache aus, so kannst du prüfen, ob es neu eingetragen ist.16. August 2009 um 20:43
Darfst mich auch Dominik nennen.
Also ganz banal gesagt: Die Daten werden nur innerhalb einer Seite in den Cache geladen. Bei einem Reload wird nicht mehr aus dem Cache geladen, da der Cache wieder leer ist. Meine Frage, warum ist das so? Oder ist das so gewollt?
17. August 2009 um 11:16
Hallo Frank,
vermutlich war mein Beitrag off-topic, aber ich versuche Dir das Problem nochmals zu schildern, vielleicht ist es Dir irgendwie bei weiteren Artikeln oder Plugins hilfreich.
Mit Interesse lese ich Deine Beiträge, nicht nur die zum Caching. Bzgl. des Cachings habe ich das als Anfänger versucht zu reproduzieren. Nun gibt es eine Menge Infos im Netz, die teilweise besagen, Cache gibt es nicht mehr, braucht nicht explizit angeschaltet werden, oder im von Dir verlinkten Codex steht zur Aktivierung: "define ('WP_CACHE', true);" anstelle von define('ENABLE_CACHE', true);".
Dann habe ich versucht den Cache zu aktivieren und anschließend zu überprüfen, ob er geht. Dabei habe ich mehrere Varianten des Aktivierens probiert, aber immer das gleiche (ähnliche) Ergebnis erhalten (Dein Plugin zur Cache Kontrolle):
Warm Cache Hits: LEER, MÜSSTE HIER WAS STEHEN?
Cold Cache Hits: LEER, MÜSSTE HIER WAS STEHEN?
Cache Misses: 442
DB Queries: 150
Loaded data:
options - 9 items
default - 5 items
users - 8 items
userlogins - 8 items
useremail - 8 items
userslugs - 8 items
posts - 91 items
post_meta - 55 items
post_tag - 148 items
category - 28 items
post_tag_relationships - 45 items
category_relationships - 48 items
general - 1 items
counts - 2 items
terms - 3 items
comment - 3 items
An Manchen Stellen im Web steht nun, das im Verzeichnis /wp-content/cache Dateien abgelegt würden. Diese sehe ich ebenfalls nicht. Bei mir wird nur ein Verzeichnis "mo" unter halb von cache angelegt, dessen Verzeichnisinhalt sich per FTP-Client nicht anzeigen läßt.
Andere Plugins, wie zum Beispiel Article2PDF nutzen den Cache, da dort entsprechende Dateien abgelegt sind (Rechte stimmen also).
Meine Systemumgebung ist WordPress 2.8.4, 128 MB, PHP 5.2.10, Linux
Meine Frage war nun, wird etwas gecached oder nicht?
Vielen Dank und hoffentlich rentieren sich Deine ganzen Mühen mal irgendwann.
Daniel
17. August 2009 um 12:48
@xdaniel: Sorry, ich gebe Kommentare, die ein Frage an mich haben, immer erst frei, wenn ich dazu komme sie überlegt zu beantworten, was nicht immer auf die schnelle geht. Oft schalte ich per iPod zwischendruch frei; ich gebe in jedem Fall jeden Kommentar händisch frei um keinen zu verpassen.
Aber zur Frage:
WordPress hat den Cache seit 2.6 immer aktiv, keine Konstante hat dabei Einfluss, siehe auch oben im Artikel. Man kann auch keine Werte dazu setzen, es liegt am Server, wie viel und gut man cacht. Die Werte meines Plugins bei dir im Frontend sind OK, da sie auch Werte ältere WP-Versionen laden können. Besser ist es, wenn du mal die andere Option aktivierst "Cache Daten"; dann werden die Elemente des Cache im backend nur für Admins ausgeben. Es werden keine Cache-Daten in Dateien abgelegt, der Cache-Ordner stammt aus der zeit vor 2.6, außer man nutzt zum Beispiel Sprachfiles, dann kann seit 2.8 die mo-Files gecahct werden, dass passiert im Ordner
cache/mo.WP-CACHE ist zu setzen, wenn man andere Cache-Lösungen einsetzen will, entweder via Plugin oder Files in wp-content.
Im Grunde heißt das seit 2.6, man muss nichts tun, es wird gecacht. Um den Cache in eigenen Plugins zu nutzen, dient der obige Artikel.
17. August 2009 um 22:56
Mir war gar nicht bewusst, dass WP einen internen Cache bietet. Danke für den Tipp!
19. August 2009 um 13:22
Du schreibst über die erste WP Cache Lösung:
> Aktiviert wurde er über die folgende Konstante: define('ENABLE_CACHE', true);
Heißt das, dass es diese Option nicht mehr gibt?
In meiner wp-config.php habe ich folgende auskommentierte Zeilen stehen:
// 1. Cache Möglichkeit (Wirklich?)
// The WP_CACHE setting, if true, includes the wp-content/advanced-cache.php script, when executing wp-settings.php.
// define ('WP_CACHE', true);
// 2. Cache Möglichkeit
// Internes Haus eigenes WP Cache aktivieren
// define('ENABLE_CACHE', true);
// Aktivierung: Im WordPress-Order wp-content den beschreibbaren Unterordner cache anlegen
// Per Default läuft der Cache nach 15 Minuten (900 Sekunden = 900) aus
. Ändern:
// define('CACHE_EXPIRATION_TIME', 900);
Ich kann also die obigen Zeilen aus meiner wp-config.php löschen, weil es diese - alten - Cache-Mechanismen nicht mehr gibt - ja?
Wie schalte ich aber den NEUEN WordPress internen Cache-Mechanismus aus? In Deiner Antwort zu xdaniel schreibst Du das geht nicht. Es werden also resourcen verschwendet, denn ich steuere mein Caching ausschliesslich über php header Zeilen die ich händisch in meine theme tempaltes eingefügt habe. Leider funktioniert das für mein theme, aber nicht für die Dateien im Admin Bereich.
Danke für die Antwort.
19. August 2009 um 14:18
@dieter: ENABLE_CACHE ist nicht mehr existent, hat keine Auswirkung. So weit mir bekannt, kannst du den Cache nicht abschalten, nur wenn du WP-CACHE aktivierst und dann ein Plugin ziehst, in dem Fall deine Erweiterung. Der Cache bassiert auf dem RAM des Server, insofern sollte da nichts verschwendet werden. Via PHP ist das sicher hungriger. Es gebt vor allem um die Queries, wo die Inhalte gecacht werden, so dass Inhalte wie Blogname etc. nicht jedes mal Ressourcen kosten. Daher bringen so Tipps wie das hinterlegen von statischen URL zum Theme kaum was.
17. Februar 2010 um 16:41
*doh* Oh mann! Danke für die Infos! Leider stehen wenn man bei Google nach "WordPress Cache" sucht, die ganzen Artikel von 2007 oben und so habe ich jetzt ewig rumprobiert und mich gewundert wieso ich das mit define('ENABLE_CACHE', true); nicht auf die Reihe bekomme... SW-Guide und Konsorten sollten mal ein kurzes Update für Experten wie mich einbauen
17. Februar 2010 um 16:50
@Matthias:
Plugin geht auch weiterhin und ist dann interessant, wenn man den Standard-Cache kontrollieren will. Zusatzcache-Lösungen gibt es zuhauf, als Plugin oder Server-Lösung. Das würde zu weit führen, wenn man dies hier diskutiert.