2013-03-28 14 views
9

Jestem nowy w usługach internetowych. Doświadczam niewytłumaczalnych losowych czasów wykonania konstruktora SoapClient. Zwykle połączenie trwa około 10 sekund. Czasami zajmuje to mniej niż sekundę, ale zdarzenie to występuje rzadziej.Konstruktor PHP SoapClient bardzo powolny

PHP SoapClient Constructor extremely slow

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

Connecting to WCF Web Service is inexplicably slow

Moja sytuacja jest podobna do tych w powyższych wątków ale rozwiązania przewidziane w nich nie rozwiązało mojego problemu.

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

Grałem z różnymi parametrami buforowania wsdl i znalazłem WSDL_CACHE_MEMORY, aby być najszybszym. Podczas korzystania z innych opcji buforowania, wywołanie trwa średnio około 25 sekund.

Nie używam wielu użytkowników.

Zmieniono katalog wsdl_cache na katalog przyjazny dla systemu Windows w pliku php.ini.

Moje pytanie jest dwojaki:

  1. Dlaczego konstruktor SoapClient pozornie losowo, jak długo to trwa do wykonania? Dlaczego zwykle trwa to dłużej, ale czasem zajmuje to tylko ułamek sekundy? Czy mogę wykonać test, aby dowiedzieć się, dlaczego tak się zachowuje?

  2. Czy należy buforować/zapisywać obiekt lub zasób SoapClient, aby po przejściu przez moją stronę od strony do strony nie trzeba było tworzyć nowego modułu SoapClient i ponownie analizować pliku WSDL? Jakie jest zalecane podejście, aby to osiągnąć?

Każda pomoc lub skierowanie we właściwym kierunku byłoby bardzo potrzebne. Dziękuję Ci.

+0

Czy plik WSDL lokalnie lub zdalnie? – datasage

+0

@datasage Próbowałem obu. Najpierw lokalny, potem zdalny. Szybsze czasy wykonania ze zdalnym sterowaniem. – cre8value

+0

spróbuj stworzyć klienta testowego z soapui - http://www.soapui.org/ czy to też jest powolne? – herrjeh42

Odpowiedz

11

Sprawdź TTL

TTL określa, jak długo WSDL będzie mieszkać w pamięci podręcznej.

soap.wsdl_cache_ttl integer 

Ustawia liczbę sekund (czas życia), które przetrzymywane pliki zostaną wykorzystane zamiast oryginałów.

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

Store WSDL lokalnie

również można pobrać WSDL do lokalnego systemu plików i używać go jako źródło dla SoapClient

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

+1 za pomysł kopiowania lokalnego. – GordonM