Costruttore PHP SoapClient molto lento

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

PHP SoapClient Constructor estremamente lento

PHP: il constructor di SoapClient è molto lento (impiega 3 minuti)

La connessione al servizio Web WCF è inspiegabilmente lenta

La mia situazione è simile a quella dei thread precedenti, ma le soluzioni fornite non risolvono il mio problema.

// config params $params = arrays( '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 di caching wsdl e ho trovato WSDL_CACHE_MEMORY il più veloce. Quando si utilizzano le altre opzioni di memorizzazione nella cache, la chiamata richiede in media circa 25 secondi.

Non sto usando più utenti.

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

La mia domanda è duplice:

  1. Perché il constructor di SoapClient è apparentemente random nel tempo impiegato 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 comport in questo modo?

  2. Devo memorizzare nella cache / salvare l'object 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 spinta nella giusta direzione sarebbe molto obbligato. Grazie.

Controlla il TTL

TTL definisce per quanto tempo il WSDL risiede nella cache.

  soap.wsdl_cache_ttl integer 

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

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

Archiviare il WSDL localmente

Inoltre, è ansible scaricare WSDL sul filesystem locale e utilizzarlo come sorgente per SoapClient

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