Sprung zum Inhalt

Webdesign nach Maß von webdesign weisshart

Output von Webservices cachen

Jens Grochtdreis hatte Probleme mit YQL. Der externe Webservice YQL lieferte (vermeintlich) keine Daten, und als Folge war Jens's Seite im Eimer. So etwas kann passieren. Immer, wenn man Daten von externen Webservices auf der eigenen Website verwendet. Deshalb gilt auch Dirk Ginaders Hinweis nicht nur für YQL:

Verlasse dich nie darauf dass webservices immer funktionieren! Du solltest grundsaetzlich immer den letzten validen YQL return auf deinem server cachen und erst mit dem naechsten validen wieder überschreiben. Die cachezeit für Seiten wie deine kann auch gerne auf min. 1 Stunde eingestellt sein. Damit wird deine Seite grundsaetzlich schneller verarbeitet und dargestellt.

Gut. Ich hab' mal versucht, diesen Rat zu beherzigen. In meinem Fall handelt es sich um einen Auszug meines Twitter-Accounts, der auf der Startseite gezeigt wird. Ohne einen Cache passiert dort Folgendes: Jedesmal, wenn Twitter down ist - und das kommt schon mal vor - wird entweder an Stelle des Twitter-Auszugs ein Fehler angezeigt (sehr selten), oder die Ladezeit der Seite um quälend lange Sekunden verlängert.

Die Cache-Datei schreiben

<?php
$twitcache = 'twitter_cache.txt';
$age = time() - filemtime($twitcache);
if ($age > (60 * 10)) {
   $inhalt = getTwitterStatus("w7t", 2);
   $open = fopen($twitcache, "w");
   fwrite($open,$inhalt);
   fclose($open);
}
?>

Erklärungen zum Script

$age ist das Alter der Cache-Datei, errechnet aus der Differenz der aktuellen Zeit und dem Zeitpunkt der letzten Änderung der Cache-Datei twitter_cache.txt. Wenn die Cache-Datei älter als 10 Minuten ist, werden mittels der Funktion getTwitterStatus() die beiden jüngsten Twitter-Updates ausgelesen. Die Funktion getTwitterStatus soll hier nicht näher beschrieben werden. Hier könnte jeder externe Webservice eingelesen werden. Wichtig ist lediglich, dass die Funktion getTwitterStatus() im Fehlerfall keine Fehlermeldung auswirft, sondern einfach mit exit; die weitere Ausführung von PHP abbricht. Damit ist sichergestellt, dass auch das folgende Schreiben der Cache-Datei nur dann erfolgt, wenn die Daten des externen Dienstes Twitter gelesen werden konnten.

Das Schreiben der Cache-Datei anstoßen

Hierfür gibt es mehrere Möglichkeiten. Ein Cronjob würde sich anbieten. Ich habe einen einfacheren Weg gewählt. Ich verlasse mich darauf, dass die Seite mit der Anzeige des Twitter-Auszugs häufig genug aufgerufen wird (z. B. auch von Suchmaschinen), und hänge das obige PHP-Script einfach ans Ende der Datei. Das kann sogar nach dem schließenden </html> sein, weil ja keine Ausgabe an den Browser geschickt wird, sondern nur die Ausführung des Scripts auf dem Server angestoßen wird.

Die Anzeige der gecachten Daten

An der Stelle, wo der Twitter-Auszug gezeigt werden soll, folgender PHP-Code:

<?php 
$twitcache = 'twitter_cache.txt';
if (file_exists($twitcache)) {
  include($twitcache);
}
?>

Fertig.
Wenn Twitter (mal wieder) nicht verfügbar ist, dann wird die Cache-Datei nicht überschrieben. Es wird der zuletzt erstellte Inhalt der Cache-Datei verwendet, und - wichtig - das Design meiner Seite nicht zerschossen.
Erwünschter Nebeneffekt: die Ladezeit meiner Startseite wird durch den Aufruf und das Verarbeiten der Twitter-Daten nicht beeinträchtigt.

1 Kommentar

  1. Der Nörgler schrieb am Freitag, 13.01.12 11:01 Uhr:

    Setzen, sechs.

    Sehr schlechter Kommentar. Bringt einem gar nichts, wenn man WebServices cachen will!

Ihr Kommentar zu diesem Artikel:

Über Ihren Kommentar oder Ihre Frage zu diesem Artikel freue ich mich. Ich behalte mir jedoch vor, Einträge wider die guten Sitten, unsinnige Einträge, oder Spam kommentarlos zu entfernen.