Sep 092011
 

Mit PHP XML-Antworten aus SOAP-Requests effektiv cachen:

1) statisches Dateicaching für XML-Requests

Webservices auf Basis von SOAP die Informationen über XML-Dokumente übertragen sind eine häufig verwendete Schnittstelle für Webanwednungen.

Für den Fall, dass viele, sehr individuelle Daten zwischen zwei Webseiten übertragen werden, kann die Schnittstelle zum Flaschenhals für die Performance werden.

Besonders negativ wirkt sich ein solcher Flachenhals aus, wenn die Daten aus den XML Anfragen direkt für die Ausgabe der Seite an Besucher durchgereicht werden. Damit kann sich der Seitenaufbau massiv verzögern.

2) Der PHP-Code

a) wichtige Konstanten definieren

//Daten eine Stunde cachen
$cachetime=3600;
//Verzeichnis festlegen und evtl. anlegen
$cache_dir="xml_cache";
if(!openDir($cache_dir)){
mkdir($cache_dir);
} 

Natürlich benötigt die PHP-Anwendung Schreibrechte auf den Ordner in dem wir unsere Daten ablegen wollen.

b) Hash für Anfrageoptionen bilden.

Wichtig ist, dass wir Anfragen mit individuellen Parametern individuelle Cache-Dateien bilden. In der Regel werden die Optionen die ein SOAP-Client an einen Server übergibt in Form eines Arrays definiert.

$options=array  (
"Art"            => 1
"Id"             => 12,
"Anzahl"      => 10,
"Preis"         => 3000
); 

Wenn wir in unserem Beispiel alle Optionen ganze Zahlen sind, bietet es sich an einen Hashwert für unsere Anfrage direkt aus den Zahlen zu bilden.

foreach($options as $option){
$hash.=intval($option);
}

Falls auch Zeichenketten als Optionen übergeben werden, bietet es sich an den Hashwert zusätzlich mit sha1 zu codieren

foreach($options as $option){
$hash.=$option;
}
$hash=sha1($hash);

anschließend geben wir unserer Cache-Datei einen Namen:

$file=$cache_dir."/".$hash.".xml";

c)Prüfen ob die Daten aus dem Cache, oder Soap abgefragt werden sollen

Es gibt drei Fälle in denen wir die Informationen über SOAP neu einlesen müssen

  1. Falls noch kein Cache existiert
  2. Falls die Cache-Zeit abgelaufen ist
  3. Falls wir unserem System (zum Beispiel zur Fehlersuche) einen entsprechenden get-Parameter mitgeben
//prüfen ob cache-Datei existiert
if(file_exists($file)){
$filetime=filemtime($file);
}
else{
$toggle=1;
}
//Regeln um vorhandenen Cache neu anzulegen
if(time()-$filetime > $cachetime){
//Datei älter als einen Tag
$toggle=1;
}
if($_GET["no_soap_cache"]=="1"){
//no_cache aktiviert
$toggle=1;
} 

d) Daten auswerten

Sobald wir bestimmt haben, ob wir die Daten aus dem Cache oder über SOAP abrufen, können wir uns ans Auswerten der Informationen machen.

Auf die Details der eventuell durchgeführten SOAP abfrage wollen wir hierbei an dieser Stelle nicht eingehen:

if($toggle==0){
$xml=simplexml_load_file($file);
}
else{
//Erzeuge Soap-Client
$client = new SoapClient("<WSDL-Dokuement>");
try{
$soap=$client->$gateway(array($request => $options));
}
catch (Exception $e) {
}
$xml=simplexml_load_string($soap->$result->any);
//Cache schreiben
if(file_exists($file)){
unlink($file);
}
$fileh=fopen($file,"a");
fwrite($fileh,utf8_encode($xml->asXML()));
fclose($fileh);}
return($xml); 

Selbst komplexe Anfragen dauern damit nur noch wenige Millisekunden. Alleine die eingesparten Latenzzeiten können, wenn mehrere Abfragen hintereinander durchgeführt werden, den Unterschied für ein positives oder negatives Surferlebnis der Besucher ausmachen.

 Antworten

Du kannst diese HTML Tags und Attribute benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(Pflichtfeld)

(Pflichtfeld)

© 2017 LAMP solutions GmbH