Einige von euch werden bereits gelesen haben, dass Tanja in Zusammenarbeit mit Oliver ein Script geschrieben hat, welches die Gravatare von den Kommentatoren in WordPress Beiträgen zwischenspeichert also in einen Cache schreibt, sodass diese nicht immer neu bei Gravatar geholt werden.
Die Idee und auch die Umsetzung ist natürlich (wie gewohnt) sehr gut gemacht. Doch ein kleiner Hacken hat die ganze Geschichte noch. Mit dem Script kann in der Comments.php angegeben werden, wie lange der Cache eines einzelnen Gravatars halten soll, bevor das Gravatar neu bei Gravatar.com heruntergeladen wird.
Wenn man diese Cache-Time allerdings zu tief setzt, dann wirkt das eher gegen und nicht für die Performance aus. Ein zu hoher Wert ist allerdings auch nicht sehr schön, da dann von Benutzern neu hochgeladene Gravatare erst nach langer Zeit in den Kommentaren ersichtlich sind.
Ich habe mir nun ein wenig Gedanken über diesen Punkt gemacht und eine Lösung gefunden, welche sich positiv auf die Performance auswirkt, aber auch für aktuelle Gravatare sorgt.
Dabei habe ich das Script von Tanja kopiert und ein weiteres Script daraus gebastelt, welches alle im Cache enthaltenen Gravatare automatisch aktualisiert. Dieses Script kann man dann beispielsweise über die Nacht per Cronjob laufen lassen. So hat man immer die neusten Gravatare und die Comments.php wird entlastet.
Das Script sieht wie folgt aus und wird in meinem Beispiel im Root-Verzeichnis des WordPress-Blogs abgelegt. Natürlich kann es auch an einem anderen Ort abgelegt werden, darauf müssen aber natürlich die Pfade angepasst werden.
Weiterhin sollte man den Zugriff auf dieses Script beispielsweise mit einer htaccess-Datei schützen oder im Cronjob mitgeben, dass es nach dem Ausführen wieder gelöscht wird.
<?php
// Pfad zu dem Image Gravatar-Cache (relativ zum Script)
$CacheImageDirectory = "redirect/other/gravatar-cache/gravatar/images/";
// Pfad zu dem HTML Gravatar-Cache (relativ zum Script)
$GravatarHTMLDirectory = "redirect/other/gravatar-cache/gravatar/";
// Dateien die älter als 24 Stunden sind aktualisieren
$MaxCacheAlter = 24 * 3600;
// Zaehler für die Anzahl Aktualisierungen
$Zaehler = 0;
$handle= opendir ($CacheImageDirectory);
while ($datei = readdir ($handle))
{
// Einzelne Pfade und Dateinamen auslesen
$gravatar_image_dateiname = $datei;
$gravatar_hash = substr ($gravatar_image_dateiname, 0, 32);
$GravatarBild = $CacheImageDirectory . $gravatar_image_dateiname ;
$GravatarHTML = $GravatarHTMLDirectory . $gravatar_hash . ".html" ;
if ($gravatar_hash == ".." or $gravatar_hash == ".")
{
// Müll
}
else
{
// Nur erneuern, wenn das Bild mindestens MaxCacheAlter Stunden alt ist
$AktuellerTimestamp = time();
$DateiTimestamp = filemtime($GravatarHTML);
$Unterschied = $AktuellerTimestamp - $DateiTimestamp;
if ($Unterschied > $MaxCacheAlter)
{
// Zaehler erhöhen
$Zaehler ++;
ob_start();
$grav_img = "http://www.gravatar.com/avatar/".$gravatar_hash."?s=64&d=identicon&r=G";
ob_start();
$fp = fopen($grav_img, "rb");
fpassthru($fp);
fclose($fp);
$file = ob_get_contents();
ob_end_clean();
$fp = fopen($GravatarBild, "wb+");
fwrite($fp, $file);
fclose($fp);
$ImageURLFuerDomain = "gravatar-cache/gravatar/images/" . $datei;
$fp = fopen($GravatarHTML, "w");
fwrite($fp,"<img alt=\"\" src=\"http://other.infoblog.li/$ImageURLFuerDomain\" class=\"avatar avatar-64 photo\" height=\"64\" width=\"64\" />");
fclose($fp);
ob_end_flush();
}
}
}
closedir($handle);
echo "Es wurden " . $Zaehler . " Dateien erneuert!";
?>
Für den Einbau und die Konfiguration sind Grundlegende PHP-Kenntnisse natürlich von Vorteil. Dabei muss man folgende Zeilen am Script selbst anpassen:
- In Zeile 3 sowie 7 müssen die Pfade zu den einzelnen Verzeichnissen (zu den HTML-Dateien & Gravatar-Bildern) relativ zum Script angepasst werden.
- In Zeile 10 kann angegeben werden, wie alt (in Stunden) die einzelnen zwischengespeicherten Gravatare minimal sein müssen, damit sie aktualisiert werden.
- In den Zeilen 43 und 58 kann angegeben werden, wie groß die Gravatar-Bilder sein sollen (Zeile 43, einmal und Zeile 58 dreimal).
- In der Zeile 58 muss schlussendlich auch noch die Domain oder auch Subdomain angepasst werden.
Vorausgesetzt ist natürlich, dass man den Beitrag von Oliver gelesen hat, damit man auch weiss, wie das Gravatar-Caching im Allgemeinen funktioniert und für was die einzelnen Verzeichnisse da sind.
Schlusswort: Wer kein Problem damit hat ein wenig Zeit für sowas zu investieren und gerne neue Sachen testet, für den ist das Thema Cravatare-cachen auf jeden Fall zu empfehlen. Natürlich funktioniert nicht immer alles sofort, aber das Ergebnis lässt sich sehen!
Da ich auch nur Mensch (und kein PHP-Experte) bin kann es gut sein, dass das Script den einen oder anderen Fehler enthält. Ich übernehme deshalb auch keine Haftung für Schäden, welche durch das Script hervorgerufen wurden.
Nachtrag: Wer selber keine Cronjobs anlegen darf / kann, sollte sich den Artikel über Cronjob.de durchlesen. Mit diesem Online-Dienst geht das auch ohne, dass man selber Cronjobs anlegen kann.

Zunächst mal herzlichen Fank für die Benennung — dass du dich der Sache angenommen hast, ehrt natürlich sehr :-)
Langsam wird’s perfekt. Die Lösung sieht wirklich gut aus. Leider isnd bei meinem Hoster keine Cronjobs erlaubt (bzw. möglich). Dies und ein paar weitere Unschönheiten lassen mich überlegen, den Hoster zu wechseln.
Wie ich gelesen habe, hast du wohl auch gewechselt(?) Was hast du denn für Erfahrungen gesammelt?
@plerzelwupp:
Kein Problem, finde die Idee Gravatare zu cachen einfach super :)
Habe aktuell auch noch keinen Cronjob einrichten lassen, werde ich aber demnächst mal machen, wenn ich sicher bin, dass das Script immer sauber läuft.
Also bei mir war es nur ein «interner» Serverwechsel, ich bin immer noch beim selben Hoster (hoststar) geblieben, da ich hier sehr zufrieden mit.
Pingback: Wordpress: Gravatare cachen - Wordpress, Gravatar, Cache, cachen, Plugin, Ladezeiten - Plerzelwupps Erfahrungen
Pingback: Gravatar Cache für Wordpress ohne Plugin | Crazy Girls Tipps
Es sieht echt klasse aus. Sobald ich wieder einen Cronjob frei habe, werde ich das mal austesten und bei mir so laufen lassen. Danke :-)
@Oliver: bei meinem Paket bei all-inkl.com habe ich 5 Cronjobs inklusive. Ansonsten kann man sie für 1,50 Euro jeweils zusätzlich kaufen ;-)
@Tanja:
Danke für das Lob :)
Du kannst ja dann kurz Bescheid geben, ob es bei dir funktioniert hat.
Wie ist das eigentlich bei all-inkl bezüglich Cronjobs geregelt ? — Kannst du die selber verwalten ?
@ Tanja & Oliver:
Danke auch nochmals euch beiden für die Erwähnung in euren Beiträgen!
Ja, bei all-inkl kann man seine Cronjobs selbst verwalten, anlegen, bearbeiten etc. Momentan mache ich damit SQL Dumps ;-)
@Tanja:
Danke für die Information :)
Muss ich mal bei meinem Hoster nachfragen, ob ich die auch über ein Webinterface selber verwalten kann.
Oh ein mächtiges Script was sich für vieles andere missbrauchen lässt. Gleich mal abspeichern^^ Kann man dies den nicht auch mit der WP eigenen Cron Funktion laufen lassen? Wäre für die Leute interessant wo keine Cronjobs vom Hoster aus anlegen können.
@Markus:
Darüber haben wir uns auch schon den einen oder anderen Gedanken gemacht, doch noch nicht wirklich eine Lösung gefunden.
Ich werde mich aber weiter umschauen, ob man das nicht doch irgendwie in den WP-Cron einbinden kann.
Zu den WP (pseudo) Cronjobs — darüber hab ich mir auch Gedanken gemacht. Bei Sergej und Frank Bültge wird auch ein Plugin vorgestellt, das ich heute installierte und mit dem ich etwas WP-cronjob_Ballast abwarf. Damit lassen sich auch solche WP-Cronjobs anlegen. Das hab ich allerdings noch nicht ausprobiert.
Das Plugin nennt sich «WP Crontrol» (kein Schreibfehler — es ist ein Wortspiel).
@Oliver:
Hat das Plugin bei dir ohne Fehler funktioniert ?
Wie ich gesehen habe, war das letzte Plugin-Update von WP Crontrol vor zwei Jahren :(
Auf der Plugin-Seite wird erklärt, wie man einen neuen Cron anlegen kann.
Wer möchte testen ? *lach*
Es hat ohne Weiteres funktioniert.
4 cronjobs hat WP von Haus aus (bis vor kurzem waren es noch 3, aber die Leerung des Papierkorbs ist noch dazugekommen).
Ich deaktivierte alle Plugins, damit deren evtl. cronjobs nicht angezeigt werden und fand neben den 4 o.g. cronjobs noch drei weitere — Überbleibsel von alten Plugins. Die konnte ich problemlos löschen.
Ich scheue mich auch nicht davor, mal einen anzulegen — Mut zur Lücke ;-)
@Oliver:
Das ist ja super, dass das so gut funktioniert hat.
Laut der Hilfe kannst du ja da einfach den PHP-Code vom Gravatar Script einfügen und den Intervall eingeben.
Wenn das wirklich so einfach ist, wäre das natürlich genial :)
Wenn das wirklich klappt sollte ihr ein Plugin draus machen, das würde bestimmt gut angenommen werden und Euch guten Traffic bringen ;-)
@Markus:
Generell sollte das ganze Optimieren ja so enden, dass man noch so wenige Plugins wie möglich aktiv hat, welche die Performance beeinträchtigen.
Wenn man jedoch genau weiss, was das Plugin macht (weil man es selber gemacht hat) sieht die ganze Sache natürlich anders aus.
Mal schauen, wie sich das Ganze entwickelt, vielleicht gibt es ja mal noch ein Plugin dazu :)
Ich bin ja selber auch ein Plugin Gegner. Man kann aber Plugins auch «gut schreiben» nenn ich es mal. Solange keine Datenbank Abfragen gemacht werden und dergleichen ist nichts dagegen einzuwenden. Ich bastel viele meiner Funktionen auch als Plugins, aber keines hat Datenbankabfragen oder irgendwelchen unnützen Hooks wo styles etc. eingebunden werden. Dann schadet es auch der Performance nicht. In diesem Fall hier wäre es ja auch nichts anderes als, die jetztige Funktion und dann eben per Hook (müsste im Codex zu finden sein) direckt den Cron erstellen. Alternatib kann man das ganze natürlich auch in der functions.php regeln, aber des Marketings wegen, wäre ein Plugin eben besser^^ Denk ich heut zu arg an Traffic? :-)
@Markus:
Ich muss dir natürlich zustimmen, solange keine grossen Datenbankabfragen oder Java-Script-Dateien mit dem Plugin kommen ist es meist kein Problem.
Ich muss jedoch auch gestehen, dass ich bis jetzt noch nie ein WP-Plugin entwickelt habe. Kennst du vielleicht ein gutes Tutorial o.ä. wie man da am Besten vorgeht … ?
Das mit dem Traffic wäre natürlich auch nicht schlecht. Weiterhin würde es vielen Leuten das Cachen von Gravataren erleichtern, da das Einbauen einer solchen PHP-Datei für einige WordPress-Benutzer bereits eine Hürde darstellt.
So … heute probiere ich das mal aus — i.V. mit dem WordPress-cronjob. Gestern hab ich auch noch einiges darüber gelesen, wie man selbst einen WP-cronjob anlegt. Aber zunächst soll das Plugin genügen. Ich halte Dich auf dem Laufenden.
Offtopic:
Wie ich sehe, hast du mittlerweile auch den Syntaxhighlighter im Einsatz. Hast du die CSS-und js-Dateien des Skripts von der Startseite verbannt? Wie ich sehe, werden diese nur in der Artikel-Ansicht geladen. Das selbe hatte ich eigentlich auch vor, doch irgendwie hab ich das nicht hingekriegt. Sie werden immer noch mit der Startseite geladen.
@Oliver:
Wäre super, wenn das funktioniert mach ich es bei mir auch auf diesen Weg :)
Absichtlich habe ich nichts gemacht. Kann dir aktuell nicht sagen, an was das liegen könnte. Ausser vielleicht, dass es am WP Super Cache liegt, das kann sein.
So wie es aussieht hast du auch das gleiche Plugin (von Alex Gorbatchev) in der aktuellsten Version.
Ich kann mir das heute Abend mal noch genauer anschauen, ich werde mich dann bei dir melden, wenn ich was herausgefunden habe.
Hi das wäre schon auch eine tolle Lösung, muss man sich deswegen aber auch extra bei Gratavar anmelden? ich weis ich habe noch keines, habe aber irgendwie nichts richtiges bei mir auf Computer:(
@Jan:
Das Script in Zusammenarbeit mit dem von Tanja & Oliver ist nur dazu da die Gravatare von Kommentatoren eines WordPress-Blogs zu cachen.
Wenn ein User einen Kommentar abgibt, jedoch kein Gravatar besitzt wird einfach ein Standard-Gravatar angezeigt.
Bei Gravatar anmelden und ein eigenes Gravatar besitzen musst du dazu nicht unbedingt.
*Nachtrag*
Alle welche sich keine eigenen Cronjobs anlegen können, denen würde ich empfehlen diesen Artikel durchzulesen :)
Hey Jeffrey,
wollte nur mitteilen: das Skript funktioniert — Cronjob ebenso!
Danke nochmlas für deine Unterstützung.
Viele Grüße
Oliver
Pingback: Auslieferung von Gravatar-Icons aus einem lokalen Cache – Download per curl « Leben des wolf-u.li
@Oliver:
Das freut mich :)
Danke auch dir für die nette Zusammenarbeit!
Hmm also ich würde sagen wenn man die Cachezeit auf 24 Stunden setzt ist das eigentlich für jedermann hinnehmbar…
@Patrick:
Bei mir beträgt die Cache-Zeit 18–48 Stunden (Zufallswert), meiner Meinung nach optimal :)
Ich optimiere gerade nochmal dein Script. Da sind ein paar Stellen, die Verbesserungswürdig sind ;)
@Patrick:
Das freut mich, dass du die Sache weiterentwickelst!
Ich freue mich auf dein WordPress-Plugin :)
Pingback: WordPress GravatarCache | www.techspread.de
Macht der Einsatz dieses Skriptes auch Sinn, wenn wenige Kommentare vorhanden sind bei Einsatz des Gravar SignUp PlugIns ?
Wir versuchen auch, jedes Zehntel herauszuholen :-)
Conni Dahmen
@Cornelia:
Ich habe den Gravatar-Cache bei mir aktuell deaktiviert, da ich mit der Performance der Gravatar-Server sehr zufrieden bin.
Aber es kann natürlich durchaus Sinn machen. Also einfach mal probieren und vergleichen :)
Pingback: Gravatare cachen | Dieter Welzel
Pingback: Gravatar in WordPress verwenden » Webmaster-Zentrale