2013-03-28 15 views
9

Ich bin neu in Web Services. Ich habe unerklärlicherweise zufällige Ausführungszeiten des SoapClient-Konstruktors. Normalerweise dauert der Anruf etwa 10 Sekunden. Manchmal dauert es weniger als eine Sekunde, aber dieses Auftreten ist weniger häufig.PHP SoapClient Konstruktor sehr langsam

PHP SoapClient Constructor extremely slow

PHP: SoapClient constructor is very slow (takes 3 minutes)

Connecting to WCF Web Service is inexplicably slow

Meine Situation in den oben genannten Themen zu denen ähnlich ist, aber die in ihnen vorgesehenen Lösungen haben mein Problem nicht beheben.

// config params 
$params = array(
    'trace'  => 1, 
    'soap_version' => SOAP_1_1, 
    'cache_wsdl' => WSDL_CACHE_MEMORY 
); 
// this call takes about 10 seconds to remote WSDL 
$soap_client = new SoapClient(WSDL_URL,$params); 

Ich habe mit den verschiedenen Wsdl Caching Parameter gespielt und fand WSDL_CACHE_MEMORY die schnellste zu sein. Bei Verwendung der anderen Caching-Optionen dauert der Anruf im Durchschnitt etwa 25 Sekunden.

Ich verwende nicht mehrere Benutzer.

Ich habe das Wsdl_cache_dir in ein Windows-freundliches Verzeichnis in php.ini geändert.

Meine Frage ist zweifach:

  1. Warum ist der Soapclient-Konstruktor scheinbar zufällig, wie lange dauert es auszuführen? Warum dauert es normalerweise länger, aber manchmal dauert es nur einen Bruchteil einer Sekunde? Gibt es einen Test, den ich durchführen kann, um zu erfahren, warum er sich so verhält?

  2. Sollte ich das SoapClient-Objekt oder die Ressource zwischenspeichern/speichern, damit meine Seitenbesucher nicht von Seite zu Seite wechseln müssen, muss ich keinen neuen SoapClient erstellen und die WSDL erneut analysieren? Was ist der empfohlene Ansatz, um das zu erreichen?

Jede Hilfe oder Schub in der richtigen Richtung viel verpflichtet wäre. Vielen Dank.

+0

Ist die WSDL-Datei lokal oder remote? – datasage

+0

@datasage Ich habe beides versucht. Zuerst lokal, dann remote. Schnellere Ausführungszeiten mit Remote. – cre8value

+0

versuche, einen Test-Client mit soapui zu erstellen - http://www.soapui.org/ ist es auch langsam? – herrjeh42

Antwort

11

Überprüfen Sie die TTL

TTL definiert, wie lange die WSDL im Cache lebt.

soap.wsdl_cache_ttl integer 

Legt die Anzahl der Sekunden (Zeit zu leben), die Cache-Dateien anstelle der Originale verwendet werden.

http://www.php.net/manual/en/soap.configuration.php#ini.soap.wsdl-cache-ttl

Speichern Sie die WSDL lokal

Auch könnten Sie die WSDL auf das lokale Dateisystem herunterladen und als Quelle verwenden für SoapClient

$client = new SoapClient("file://path/wsdl.file", array(
    'location' => "http://domain/ws-endpoint", 
)); 
+0

+1 für die lokale Kopieridee. – GordonM