Tutorial Amazon Web Services mit PHP – III – Caching von Funktionsaufrufen

Im vorherigen Teil haben wir eine XML von den AWS mit cURL geladen. Aber Was heißt eigentlich Funktionscaching, und wieso brauchen wir das? Ganz einfach: Eine Funktion wird aufgerufen, führt Berechnungen durch und gibt das Ergebnis zurück. Die Berechnungen können sehr einfach sein, aber auch sehr viel kosten. Würden wir zum Beispiel den Download des XML von den Amazon Web Services in eine Funktion verpacken und bei jedem Aufruf das XML neu laden, würde das sehr teuer werden. Stattdessen macht es mehr Sinn, das XML zu cachen. Es gibt nun viele verschiedene Möglichkeiten das XML zu cachen, und die wohl einfachste ist es, einen allgemeinen Ansatz zu verwenden, der ganze Funktionsaufrufe cached. Dies können wir zum Beispiel auch für Datenbankaufrufe verwenden.

Hierbei liegt die Tücke allerdings im Detail, denn ein Aufruf der eigentlichen Funktion mit verschiedenen Parametern wird in der Regel auch verschiedene Antworten liefern. Es gilt also nicht die Funktion global zu cachen, sondern auch die Parameter zu berücksichtigen. Gleiche Parameter liefern gleiche Ergebnisse, ändern sich die Parameter muss zum Beispiel in unserem Fall die XML neu geladen werden.

Wir könnten uns nun den Kopf zermartern über eine eigene Caching-Funktion, aber wieso soll man das Rad neu erfinden? Ich nehme in der Regel Cache_Lite aus der Pear (direkter Download). Cache_Lite ist ein Programmpaket das genau das macht was wir wollen, und für uns erstmal eine Blackbox darstellt: Es ist egal was es macht, Hauptsache es funktioniert :)

Voraussetzung ist natürlich, dass wir eine Funktion hätten, die eine XML bei den AWS abfragt, diese könnte zum Beispiel wie folgt aussehen:

function aws_load_xml( $url ) {
	$ch = curl_init();
	curl_setopt( $ch, CURLOPT_URL, $url );
	curl_setopt( $ch, CURLOPT_HEADER, 0 );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
	$answer = curl_exec( $ch );
	curl_close( $ch );
	return $answer;
}

Den Funktionsaufruf müssten wir nun cachen, dies geschieht mich Cache_Lite wie folgt:

/ Include der Cache_Lite-Klasse
require_once('Cache/Lite/Function.php');
 
// Konfigurieren von Cache_Lite
$options = array(
		// Cache-Verzeichnis
    'cacheDir' => '/tmp/',
    // Lebenszeit eines gecachten Funktionsaufrufs
    'lifeTime' => 10
);
 
// Cache_Lite initialiseren
$cache = new Cache_Lite_Function($options);
 
// Eigene Funktion aufrufen
$cache->call('aws_load_xml', "http://ecs.amazonaws.de/onca/xml?Service=AWSECommerceService");

Das war es schon ;) Den Rest der Arbeit übernimmt Cache_Lite. Das Beispiel ist natürlich recht einfach gestrickt, es verfügt über keine Fehlerbehandlung. Aber um eine Garbage Collection brauchen wir uns zumindest keine Sorgen machen, das übernimmt Cache_Lite selbstständig. Das Paket ist natürlich nicht nur für unseren XML-Abruf gut, sondern es lässt sich jede beliebige Funktion damit cachen. Es ist zum Beispiel bei aufwendigen Datenbankabfragen von Interesse.

Nachdem wir nun wissen, wie wir ein XML laden und dieses Cachen sollten wir uns als Nächstes um die Ausgabe der Daten sorgen machen. Und hier gilt stets die Prämisse: Content und Design werden strikt voneinander getrennt, aber dazu mehr im nächsten Teil des Kurses.

Ähnliche Beiträge

10 nützliche PHP Snippets PHP ist eine fast sinnvolle Programmiersprache bei der am Ende alles immer so endet, dass man die gleichen Aufgaben immer wieder erledigen muss. Insof...
Testdaten generieren mit Faker Unit-Tests sind ja eine feine Sache aber meistens mangelt es Ihnen in PHP an einer entscheidenden Grundlage: Testdaten. Wer kennt das nicht? Man baut ...
Simple Regex Language für PHP Simple Regex Language ist eine sehr interessante Bibliothek für PHP. Regex sind eine Sache die zum einen durchaus komplex werden können, zum anderen a...
Chatbots in PHP mit BotMan Die größte Sau die in 2017 bisher durchs Dorf getrieben wird, ist der Chatbot. Ein zugegeben sehr komische Entwicklung denn die Bots gibt es schon ewi...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.