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

Smarty 3.0 Beta 1 veröffentlicht Ich gebe zu das Smarty ein persönlicher Liebling von mir ist. Zum einen kann ich damit erreichen das mein PHP-Code keinen „Optimierungen“ von Designer...
Happy birthday phphatesme.com Tja, was soll ich sagen, mein Lieblings-PHP-Blog wird 1 Jahr alt. Schon recht erstaunlich, wie schnell man sich an den Blog gewöhnt hat :) Vielleicht ...
Online Entwicklungsumgebungen für PHP Nunja, ich gebe zu, der Titel ist etwas reißerisch, denn von einer richten Entwicklungsumgebung kann man wohl kaum sprechen! Dennoch sind mir in der l...
Sinnvolles HTML in PHP mit dem HTML Purifier Es kommt im Leben eines Programmierers stets der Punkt, wo er sich durch die Weiten des HTML graben, und es insbesondere mit PHP interpretieren muss. ...

Schreibe einen Kommentar

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