nusoap & Amazon WSDL-Service

andy72

Erfahrenes Mitglied
Hallo @all,

Bin gerade dabei, Webservices in meiner HP einzubauen.Rein von der Funktion her läuft es,
jedoch finde ich die Geschwindigkeit arg langsam, bis ich relevante Daten bekomme.
Beim Einschalten der Debug-Funktion in nusoap bemerkte ich, dass Amazon zig Tausend (für mich) unnütze Daten schickt, bevor ich den eigentlichen Request starten kann, nur um ein paar Bücher über einen Suchbegriff zu finden, den der User bei mir auf der Seite eingibt.

Frage: Kann man das irgendwie beschleunigen ?

LG & Danke
Andy
 
Liegt glaube ich nicht am Cache, da das Ergebnis MIT und OHNE cache dasselbe ist.
Der Code ist ganz Simple, habe ihn aus dem Beispielcode von nusoap & den Amazon-WSDL API. Bin gerade dabei, den Code umzubauen auf cUrl & simpleXML - das Response ist um ein dreiviertel schneller, da man den Amazon-Service auch über einen URL-Request direkt aufrufen kann. Werde das nachher mal hier online stellen - ich denke, WSDL ist nicht die beste Lösung, da ich früher mal mit MSN ein ähnliches Problem hatte, als ich in JAVA mal einen MSN-Client gebaut habe, der Protokoll 13 versteht (MSN Live-Services) - das Ding war genauso langsam ;)
 
Unterstütz dein PHP vielleicht auch die standart Soap Funktionen? Mit denen Lässt meiner meinung nach am einfachsten Arbeiten wenn man WSDL zur verfügung hat.
 
Habe das ganze jetzt SO gelöst, und es ist sau schnell :D
PHP:
<?php

class v_amazon {
  var $params;
  var $url;
  var $result;
  var $error;
  
  function _parseResponse() {
    $xml = new SimpleXMLElement($this->result);
    $retval = NULL;
    if( $xml->OperationRequest->Errors ) {
      $this->error = $xml->OperationRequest->Errors->Error->Code;
      return NULL;
    }
    foreach ($xml->Items as $item) {
      foreach ($item->Item as $result) {
        $page  = $result->DetailPageURL;
        $title = $result->ItemAttributes->Title;
        $nprice = $result->OfferSummary->LowestNewPrice->FormattedPrice;
        $uprice = $result->OfferSummary->LowestUsedPrice->FormattedPrice;
        $price = ($uprice) ? $uprice : $nprice;
        $image = $result->SmallImage->URL;
        $imgw  = $result->SmallImage->Width;
        $imgh  = $result->SmallImage->Height;
        $retval .= '<img src="'.$image.'" width="'.$imgw.'" height="'.$imgh.'" />'.$price.'<br>';
      }
    }
    return $retval;
  }
  
  function v_amazon() {
    $this->params  = "&SubscriptionId=-----------------YOUR SUBSCRIPTIONID FROM AMAZON-----------------";
    $this->params .= "&Operation=ItemSearch&SearchIndex=Books&ResponseGroup=Request,Medium,SalesRank";
    $this->url     = "http://webservices.amazon.de/onca/xml?Service=AWSECommerceService";
  }
  
  function search($keyword) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $this->url."&".$this->params."&Keywords=".urlencode($keyword));
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_PORT, 80);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $this->result = curl_exec($ch);
    $retval = $this->_parseResponse();
    return ($this->error) ? $this->error : $retval;
  }
}

$a = new v_amazon;
echo $a->search("PHP");

?>

Wäre jetzt noch interessant, ob PHP's SOAP Implementation schneller ist als meine Variante und/oder nusoap ;)

LG
Andy
 
Den Vorteil den der WSDL Modus bietet ist eben die Datenvalidierung. PHP Weis vor dem Absenden der Daten ob diese so Valide sind oder nicht.

Ich denke mal allzuviele Suchbegriffe wird niemand eingeben sodass du keine Probleme mit der maximalen länge haben wirst. Für andere komplexere Anwendungen geht es so halt eben nicht.

Ich glaube nicht das ich es von den Format wegändern würde.


Generell spricht nichts dagegen die Requests selbst zu machen und über cURL abzufragen. Bei meinem aktuellen Projekt bin ich sogar daran gebunden da über die HTTP Header eine openssl authentifizierung und sinaturen läuft.
 
Ich denke mal allzuviele Suchbegriffe wird niemand eingeben sodass du keine Probleme mit der maximalen länge haben wirst. Für andere komplexere Anwendungen geht es so halt eben nicht.

Was genau meinst Du damit ?
Auf meiner Seite ist eine Suche innerhalb meiner DB möglich, Amazon ist nur eine kleine Erweiterung,die der User zu sehen bekommt, wenn was relevantes gefunden wird. Wer sagt denn,dass der user nicht mehr als 50.000 Zeichen eingibt ? Klar, ich kann diese Daten ungesehen senden - aber wenn das Amazon mitbekommt, werde ich die Partner-Id wohl nicht lange haben. Also ist meine Idee dazu:

PHP:
$query = urldecode($keyword);
$query = strip_tags($query);
$query = trim($query);
if( strlen($query) < 100) )
  sende_request($query);
 
Ich denke nicht das du dir darum gedanken machen musst. Deren Webserver hat (wie jeder) eine maximale URL Länge eingestellt und alles was länger ist wird eben abgeschnitten. Da nur die Keywords am Ende sind kann dir das eignetlich Ziemlich egal sein.

Möglicherweise würde CURL nen Error werfen.

Ich errinere mich das irgendwas in der 2000 Zeichen Region das Ende war.

Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.

request failed: URI too long
 
na gut ...2000 Zeichen ist arg lang - das muss denn schon gewollt sein, und wenn der user dann nix zu sehen bekommt ausser ne fehlermeldung, denn isses mir wirklich egal :D

Dann hake ich das Thema hiermit als erledigt ab -Dank Dir / Euch :)

LG
Andy
 
Zurück