WordPress Gravatar Cache mit automatischer Aktualisierung

16.02.2010 | 35 Kommentare | Jeffrey

Einige von euch wer­den bereits gele­sen haben, dass Tanja in Zusam­men­ar­beit mit Oli­ver ein Script geschrie­ben hat, wel­ches die Gra­va­tare von den Kom­men­ta­to­ren in Word­Press Bei­trä­gen zwi­schen­spei­chert also in einen Cache schreibt, sodass diese nicht immer neu bei Gra­va­tar geholt werden.

Die Idee und auch die Umset­zung ist natür­lich (wie gewohnt) sehr gut gemacht. Doch ein klei­ner Hacken hat die ganze Geschichte noch. Mit dem Script kann in der Comments.php ange­ge­ben wer­den, wie lange der Cache eines ein­zel­nen Gra­va­t­ars hal­ten soll, bevor das Gra­va­tar neu bei Gravatar.com her­un­ter­ge­la­den wird.

Wenn man diese Cache-Time aller­dings zu tief setzt, dann wirkt das eher gegen und nicht für die Per­for­mance aus. Ein zu hoher Wert ist aller­dings auch nicht sehr schön, da dann von Benut­zern neu hoch­ge­la­dene Gra­va­tare erst nach lan­ger Zeit in den Kom­men­ta­ren ersicht­lich sind.

Ich habe mir nun ein wenig Gedan­ken über die­sen Punkt gemacht und eine Lösung gefun­den, wel­che sich posi­tiv auf die Per­for­mance aus­wirkt, aber auch für aktu­elle Gra­va­tare sorgt.

Dabei habe ich das Script von Tanja kopiert und ein wei­te­res Script dar­aus gebas­telt, wel­ches alle im Cache ent­hal­te­nen Gra­va­tare auto­ma­tisch aktua­li­siert. Die­ses Script kann man dann bei­spiels­weise über die Nacht per Cron­job lau­fen las­sen. So hat man immer die neus­ten Gra­va­tare und die Comments.php wird entlastet.

Das Script sieht wie folgt aus und wird in mei­nem Bei­spiel im Root-Verzeichnis des WordPress-Blogs abge­legt. Natür­lich kann es auch an einem ande­ren Ort abge­legt wer­den, dar­auf müs­sen aber natür­lich die Pfade ange­passt werden.

Wei­ter­hin sollte man den Zugriff auf die­ses Script bei­spiels­weise mit einer htaccess-Datei schüt­zen oder im Cron­job mit­ge­ben, dass es nach dem Aus­füh­ren wie­der 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 Ein­bau und die Kon­fi­gu­ra­tion sind Grund­le­gende PHP-Kenntnisse natür­lich von Vor­teil. Dabei muss man fol­gende Zei­len am Script selbst anpassen:

  • In Zeile 3 sowie 7 müs­sen die Pfade zu den ein­zel­nen Ver­zeich­nis­sen  (zu den HTML-Dateien & Gravatar-Bildern) rela­tiv zum Script ange­passt werden.
  • In Zeile 10 kann ange­ge­ben wer­den, wie alt (in Stun­den) die ein­zel­nen zwi­schen­ge­spei­cher­ten Gra­va­tare mini­mal sein müs­sen, damit sie aktua­li­siert werden.
  • In den Zei­len 43 und 58 kann ange­ge­ben wer­den, wie groß die Gravatar-Bilder sein sol­len (Zeile 43, ein­mal und Zeile 58 dreimal).
  • In der Zeile 58 muss schluss­end­lich auch noch die Domain oder auch Sub­do­main ange­passt werden.

Vor­aus­ge­setzt ist natür­lich, dass man den Bei­trag von Oli­ver gele­sen hat, damit man auch weiss, wie das Gravatar-Caching im All­ge­mei­nen funk­tio­niert und für was die ein­zel­nen Ver­zeich­nisse da sind.

Bild: Alessandro Rei über iconfinder.net Schluss­wort: Wer kein Pro­blem damit hat ein wenig Zeit für sowas zu inves­tie­ren und gerne neue Sachen tes­tet, für den ist das Thema Cravatare-cachen auf jeden Fall zu emp­feh­len. Natür­lich funk­tio­niert nicht immer alles sofort, aber das Ergeb­nis lässt sich sehen!

Da ich auch nur Mensch (und kein PHP-Experte) bin kann es gut sein, dass das Script den einen oder ande­ren Feh­ler ent­hält. Ich über­nehme des­halb auch keine Haf­tung für Schä­den, wel­che durch das Script her­vor­ge­ru­fen wurden.

Nach­trag: Wer sel­ber keine Cron­jobs anle­gen darf / kann, sollte sich den Arti­kel über Cronjob.de durch­le­sen. Mit die­sem Online-Dienst geht das auch ohne, dass man sel­ber Cron­jobs anle­gen kann.

Ähnliche Artikel

Schneller WordPress Cache mit Cachify
Gründe warum du Gravatar benutzen sollst!
W3 Total Cache: WordPress Cache Plugin mit CDN Funktion
WP Super Cache: WordPress Blog wird zur Rakete!
Gravatar — Einheitliche Avatare benutzen

35 Kommentare

  1. plerzelwupp (16/02/2010) Antworten

    Zunächst mal herz­li­chen Fank für die Benen­nung — dass du dich der Sache ange­nom­men hast, ehrt natür­lich sehr :-)

    Lang­sam wird’s per­fekt. Die Lösung sieht wirk­lich gut aus. Lei­der isnd bei mei­nem Hos­ter keine Cron­jobs erlaubt (bzw. mög­lich). Dies und ein paar wei­tere Unschön­hei­ten las­sen mich über­le­gen, den Hos­ter zu wechseln.

    Wie ich gele­sen habe, hast du wohl auch gewech­selt(?) Was hast du denn für Erfah­run­gen gesammelt?

  2. Jeffrey (16/02/2010) Antworten

    @plerzelwupp:

    Kein Pro­blem, finde die Idee Gra­va­tare zu cachen ein­fach super :)

    Habe aktu­ell auch noch kei­nen Cron­job ein­rich­ten las­sen, werde ich aber dem­nächst mal machen, wenn ich sicher bin, dass das Script immer sau­ber läuft.

    Also bei mir war es nur ein «inter­ner» Ser­ver­wech­sel, ich bin immer noch beim sel­ben Hos­ter (host­star) geblie­ben, da ich hier sehr zufrie­den mit.

  3. Crazy Girl (16/02/2010) Antworten

    Es sieht echt klasse aus. Sobald ich wie­der einen Cron­job frei habe, werde ich das mal aus­tes­ten und bei mir so lau­fen las­sen. Danke :-)

    @Oliver: bei mei­nem Paket bei all-inkl.com habe ich 5 Cron­jobs inklu­sive. Ansons­ten kann man sie für 1,50 Euro jeweils zusätz­lich kaufen ;-)

  4. Jeffrey (16/02/2010) Antworten

    @Tanja:

    Danke für das Lob :)
    Du kannst ja dann kurz Bescheid geben, ob es bei dir funk­tio­niert hat.

    Wie ist das eigent­lich bei all-inkl bezüg­lich Cron­jobs gere­gelt ? — Kannst du die sel­ber verwalten ?

    @ Tanja & Oliver:

    Danke auch noch­mals euch bei­den für die Erwäh­nung in euren Beiträgen!

  5. Crazy Girl (16/02/2010) Antworten

    Ja, bei all-inkl kann man seine Cron­jobs selbst ver­wal­ten, anle­gen, bear­bei­ten etc. Momen­tan mache ich damit SQL Dumps ;-)

  6. Jeffrey (16/02/2010) Antworten

    @Tanja:

    Danke für die Information :)

    Muss ich mal bei mei­nem Hos­ter nach­fra­gen, ob ich die auch über ein Web­in­ter­face sel­ber ver­wal­ten kann.

  7. Markus (16/02/2010) Antworten

    Oh ein mäch­ti­ges Script was sich für vie­les andere miss­brau­chen lässt. Gleich mal abspei­chern^^ Kann man dies den nicht auch mit der WP eige­nen Cron Funk­tion lau­fen las­sen? Wäre für die Leute inter­es­sant wo keine Cron­jobs vom Hos­ter aus anle­gen können.

  8. Jeffrey (16/02/2010) Antworten

    @Markus:

    Dar­über haben wir uns auch schon den einen oder ande­ren Gedan­ken gemacht, doch noch nicht wirk­lich eine Lösung gefunden.

    Ich werde mich aber wei­ter umschauen, ob man das nicht doch irgend­wie in den WP-Cron ein­bin­den kann.

  9. plerzelwupp (16/02/2010) Antworten

    Zu den WP (pseudo) Cron­jobs — dar­über hab ich mir auch Gedan­ken gemacht. Bei Ser­gej und Frank Bültge wird auch ein Plu­gin vor­ge­stellt, das ich heute instal­lierte und mit dem ich etwas WP-cronjob_Ballast abwarf. Damit las­sen sich auch sol­che WP-Cronjobs anle­gen. Das hab ich aller­dings noch nicht aus­pro­biert.
    Das Plu­gin nennt sich «WP Cron­trol» (kein Schreib­feh­ler — es ist ein Wortspiel).

  10. Jeffrey (16/02/2010) Antworten

    @Oliver:

    Hat das Plu­gin bei dir ohne Feh­ler funktioniert ?

    Wie ich gese­hen habe, war das letzte Plugin-Update von WP Cron­trol vor zwei Jahren :(

    Auf der Plugin-Seite wird erklärt, wie man einen neuen Cron anle­gen kann.

    Wer möchte tes­ten ? *lach*

  11. plerzelwupp (16/02/2010) Antworten

    Es hat ohne Wei­te­res funktioniert.

    4 cron­jobs hat WP von Haus aus (bis vor kur­zem waren es noch 3, aber die Lee­rung des Papier­korbs ist noch dazugekommen).

    Ich deak­ti­vierte alle Plugins, damit deren evtl. cron­jobs nicht ange­zeigt wer­den und fand neben den 4 o.g. cron­jobs noch drei wei­tere — Über­bleib­sel von alten Plugins. Die konnte ich pro­blem­los löschen.

    Ich scheue mich auch nicht davor, mal einen anzu­le­gen — Mut zur Lücke ;-)

  12. Jeffrey (16/02/2010) Antworten

    @Oliver:

    Das ist ja super, dass das so gut funk­tio­niert hat.

    Ich scheue mich auch nicht davor, mal einen anzu­le­gen – Mut zur Lücke ;-)

    Laut der Hilfe kannst du ja da ein­fach den PHP-Code vom Gra­va­tar Script ein­fü­gen und den Inter­vall eingeben.

    Wenn das wirk­lich so ein­fach ist, wäre das natür­lich genial :)

  13. Markus (16/02/2010) Antworten

    Wenn das wirk­lich klappt sollte ihr ein Plu­gin draus machen, das würde bestimmt gut ange­nom­men wer­den und Euch guten Traf­fic bringen ;-)

  14. Jeffrey (16/02/2010) Antworten

    @Markus:

    Gene­rell sollte das ganze Opti­mie­ren ja so enden, dass man noch so wenige Plugins wie mög­lich aktiv hat, wel­che die Per­for­mance beeinträchtigen.

    Wenn man jedoch genau weiss, was das Plu­gin macht (weil man es sel­ber gemacht hat) sieht die ganze Sache natür­lich anders aus.

    Mal schauen, wie sich das Ganze ent­wi­ckelt, viel­leicht gibt es ja mal noch ein Plu­gin dazu :)

  15. Markus (16/02/2010) Antworten

    Ich bin ja sel­ber auch ein Plu­gin Geg­ner. Man kann aber Plugins auch «gut schrei­ben» nenn ich es mal. Solange keine Daten­bank Abfra­gen gemacht wer­den und der­glei­chen ist nichts dage­gen ein­zu­wen­den. Ich bas­tel viele mei­ner Funk­tio­nen auch als Plugins, aber kei­nes hat Daten­bank­ab­fra­gen oder irgend­wel­chen unnüt­zen Hooks wo styles etc. ein­ge­bun­den wer­den. Dann scha­det es auch der Per­for­mance nicht. In die­sem Fall hier wäre es ja auch nichts ande­res als, die jetz­tige Funk­tion und dann eben per Hook (müsste im Codex zu fin­den sein) direckt den Cron erstel­len. Alter­na­tib kann man das ganze natür­lich auch in der functions.php regeln, aber des Mar­ke­tings wegen, wäre ein Plu­gin eben bes­ser^^ Denk ich heut zu arg an Traffic? :-)

  16. Jeffrey (16/02/2010) Antworten

    @Markus:

    Ich muss dir natür­lich zustim­men, solange keine gros­sen Daten­bank­ab­fra­gen oder Java-Script-Dateien mit dem Plu­gin kom­men ist es meist kein Problem.

    Ich muss jedoch auch geste­hen, dass ich bis jetzt noch nie ein WP-Plugin ent­wi­ckelt habe. Kennst du viel­leicht ein gutes Tuto­rial o.ä. wie man da am Bes­ten vorgeht … ?

    Das mit dem Traf­fic wäre natür­lich auch nicht schlecht. Wei­ter­hin würde es vie­len Leu­ten das Cachen von Gra­va­t­aren erleich­tern, da das Ein­bauen einer sol­chen PHP-Datei für einige WordPress-Benutzer bereits eine Hürde darstellt.

  17. plerzelwupp (17/02/2010) Antworten

    So … heute pro­biere ich das mal aus — i.V. mit dem WordPress-cronjob. Ges­tern hab ich auch noch eini­ges dar­über gele­sen, wie man selbst einen WP-cronjob anlegt. Aber zunächst soll das Plu­gin genü­gen. Ich halte Dich auf dem Laufenden.

    Off­to­pic:
    Wie ich sehe, hast du mitt­ler­weile auch den Syn­tax­high­ligh­ter im Ein­satz. Hast du die CSS-und js-Dateien des Skripts von der Start­seite ver­bannt? Wie ich sehe, wer­den diese nur in der Artikel-Ansicht gela­den. Das selbe hatte ich eigent­lich auch vor, doch irgend­wie hab ich das nicht hin­ge­kriegt. Sie wer­den immer noch mit der Start­seite geladen.

  18. Jeffrey (17/02/2010) Antworten

    @Oliver:

    Ich halte Dich auf dem Laufenden.

    Wäre super, wenn das funk­tio­niert mach ich es bei mir auch auf die­sen Weg :)

    Hast du die CSS-und js-Dateien des Skripts von der Start­seite verbannt?

    Absicht­lich habe ich nichts gemacht. Kann dir aktu­ell nicht sagen, an was das lie­gen könnte. Aus­ser viel­leicht, dass es am WP Super Cache liegt, das kann sein.

    So wie es aus­sieht hast du auch das glei­che Plu­gin (von Alex Gor­bat­chev) in der aktu­ells­ten Version.

    Ich kann mir das heute Abend mal noch genauer anschauen, ich werde mich dann bei dir mel­den, wenn ich was her­aus­ge­fun­den habe.

  19. jan (17/02/2010) Antworten

    Hi das wäre schon auch eine tolle Lösung, muss man sich des­we­gen aber auch extra bei Grata­var anmel­den? ich weis ich habe noch kei­nes, habe aber irgend­wie nichts rich­ti­ges bei mir auf Computer:(

    • Jeffrey (17/02/2010)

      @Jan:

      Das Script in Zusam­men­ar­beit mit dem von Tanja & Oli­ver ist nur dazu da die Gra­va­tare von Kom­men­ta­to­ren eines WordPress-Blogs zu cachen.
      Wenn ein User einen Kom­men­tar abgibt, jedoch kein Gra­va­tar besitzt wird ein­fach ein Standard-Gravatar angezeigt.

      Bei Gra­va­tar anmel­den und ein eige­nes Gra­va­tar besit­zen musst du dazu nicht unbedingt.

  20. Jeffrey (17/02/2010) Antworten

    *Nach­trag*

    Alle wel­che sich keine eige­nen Cron­jobs anle­gen kön­nen, denen würde ich emp­feh­len die­sen Arti­kel durch­zu­le­sen :)

  21. plerzelwupp (19/02/2010) Antworten

    Hey Jef­frey,

    wollte nur mit­tei­len: das Skript funk­tio­niert — Cron­job ebenso!

    Danke noch­m­las für deine Unterstützung.

    Viele Grüße
    Oliver

  22. Jeffrey (19/02/2010) Antworten

    @Oliver:

    Das freut mich :)
    Danke auch dir für die nette Zusammenarbeit!

  23. Patrick (18/03/2010) Antworten

    Hmm also ich würde sagen wenn man die Cache­zeit auf 24 Stun­den setzt ist das eigent­lich für jeder­mann hinnehmbar…

  24. Jeffrey (18/03/2010) Antworten

    @Patrick:

    Bei mir beträgt die Cache-Zeit 18–48 Stun­den (Zufalls­wert), mei­ner Mei­nung nach optimal :)

  25. Patrick (24/03/2010) Antworten

    Ich opti­miere gerade noch­mal dein Script. Da sind ein paar Stel­len, die Ver­bes­se­rungs­wür­dig sind ;)

    • Jeffrey (24/03/2010)

      @Patrick:

      Das freut mich, dass du die Sache wei­ter­ent­wi­ckelst!
      Ich freue mich auf dein WordPress-Plugin :)

  26. Pingback: WordPress GravatarCache | www.techspread.de

  27. Cornelia Dahmen (17/05/2010) Antworten

    Macht der Ein­satz die­ses Skrip­tes auch Sinn, wenn wenige Kom­men­tare vor­han­den sind bei Ein­satz des Gra­var SignUp PlugIns ?

    Wir ver­su­chen auch, jedes Zehn­tel herauszuholen :-)

    Conni Dah­men

  28. Jeffrey (17/05/2010) Antworten

    @Cornelia:

    Ich habe den Gravatar-Cache bei mir aktu­ell deak­ti­viert, da ich mit der Per­for­mance der Gravatar-Server sehr zufrie­den bin.

    Aber es kann natür­lich durch­aus Sinn machen. Also ein­fach mal pro­bie­ren und vergleichen :)

Hinterlasse einen Kommentar zu Cornelia Dahmen Abbrechen

Kommentieren ohne Angabe von Name und E-Mail Adresse möglich. Kommentare werden moderiert. Spam und Offtopic wird gelöscht.