2013-03-28 12 views
9

Sono nuovo ai servizi Web. Sto sperimentando tempi di esecuzione del costruttore SoapClient inspiegabilmente casuali. Di solito la chiamata dura circa 10 secondi. A volte ci vuole meno di un secondo, ma questo evento è meno frequente.PHP SoapClient costruttore molto lento

PHP SoapClient Constructor extremely slow

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

Connecting to WCF Web Service is inexplicably slow

La mia situazione è simile a quelli nei thread di cui sopra, ma le soluzioni fornite in essi non ha risolto il mio problema.

// 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); 

Ho giocato con i diversi parametri WSDL di cache ed è risultato WSDL_CACHE_MEMORY essere il più veloce. Quando si utilizzano le altre opzioni di memorizzazione nella cache, la chiamata richiede in media circa 25 secondi.

Non sto utilizzando più utenti.

Ho modificato wsdl_cache_dir in una directory di Windows in php.ini.

La mia domanda è duplice:

  1. Perché è il costruttore SoapClient apparentemente casuale in quanto tempo ci vuole per l'esecuzione? Perché di solito richiede più tempo, ma a volte richiede solo una frazione di secondo? C'è un test che posso eseguire per capire perché si comporta in questo modo?

  2. Devo memorizzare nella cache/salvare l'oggetto o la risorsa SoapClient in modo tale che quando i visitatori della mia pagina si spostano da una pagina all'altra non è necessario creare un nuovo SoapClient e ri-analizzare nuovamente il WSDL? Qual è l'approccio consigliato per farlo?

Qualsiasi aiuto o spunto nella giusta direzione sarebbe molto obbligato. Grazie.

+0

è il file WSDL locale o remoto? – datasage

+0

@datasage Ho provato entrambi. Prima il locale, poi il remoto. Tempi di esecuzione più rapidi con telecomando. – cre8value

+0

prova a creare un client di prova con soapui - http://www.soapui.org/ è lento? – herrjeh42

risposta

11

Controllare il TTL

TTL definisce per quanto tempo il WSDL risiede nella cache.

soap.wsdl_cache_ttl integer 

Imposta il numero di secondi (tempo di vivere), che memorizzati nella cache i file verranno utilizzati al posto degli originali.

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

Conservare il WSDL localmente

Inoltre si potrebbe scaricare il WSDL al file system locale e usarlo come fonte per SoapClient

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

+1 per l'idea della copia locale. – GordonM