2014-05-21 14 views
5

Sto usando il seguente metodo cercando di impostare un timeout su SoapClient. $this->_soap è un Zend_Soap_Client che include un oggetto SoapClient.SoapClient/Zend_Soap_Client con timeout

A volte la chiamata API che sto facendo richiede> 60 secondi. Sto cercando di impostare un timeout di 10 secondi, ma questo non funziona.

1. Uso stream_context_create:

public function setTimeout($timeout) 
{ 
    $this->_soap->setStreamContext(stream_context_create(array(
     'http' => array(
      'timeout' => intval($timeout) 
     ) 
    ))); 
} 

2. ho provato come parte del costruttore, come in questa risposta (PHP SoapClient Timeout) che sta lavorando con SoapClient oggetto:

$this->_soap  = new \Zend_Soap_Client($this->_wsdl, array(
     'soap_version'  => SOAP_1_1, 
     'connection_timeout' => intval($timeout) 
    )); 

Ma non funziona perché Zend non supporta questa opzione e genera Unknown SOAP client option.

3. ho cercato default_socket_timeout:

ini_set("default_socket_timeout", intval($timeout)); 

Nessuno di coloro che hanno fatto un lavoro:

API calls times (seconds):  min 0.3012  max 23.0334  avg 2.5005 

Quello che potuto provare ora è, da aggiungere al public function setOptions($options) in "\ Zend \ Soap \ Client.php "con un timeout, ma non voglio toccare i file core di Zend ..

risposta

4

Dubito che sia possibile impostare dinamicamente l'opzione timeout.

Tuttavia, si può provare questo metodo?

$this->_soap->setSoapClient(
    new SoapClient(
     $this->_wsdl, 
     array(
      'soap_version'  => SOAP_1_1, 
      'connection_timeout' => intval($timeout) 
     ) 
    ) 
); 

Spero che sia d'aiuto. Grazie

+0

A causa delle nostre specifiche di progetto, devo usare il 'Zend_Soap_Client'. Forse posso convincerli a questa soluzione, altrimenti devono vivere con un cronjob molto lento. – DanFromGermany

+1

@DanFromGermany: '_soap' è ancora un' Zend_Soap_Client'! Il metodo 'setSoapClient' è un metodo' Zend_Soap_Client'. Come puoi vedere nella definizione di classe 'Zend_Soap_Client', internamente usa la classe' SoapClient' di PHP. –

+0

Hai ragione, l'ho appena visto dopo aver visto la fonte di '\ Zend \ Soap \ Client.php'. – DanFromGermany

2

Nella documentazione: SoapClient:

Il connection_timeout opzione definisce un timeout in secondi per la connessione al servizio SOAP. Questa opzione non definisce un timeout per i servizi con risposte lente. Per limitare il tempo di attesa delle chiamate per completare l'impostazione default_socket_timeout è disponibile.