2013-09-27 160 views
3

用戶在我的網站上註冊後,我需要發送一個不妨礙用戶的方法中的soap請求。如果肥皂服務器運行緩慢,我不希望最終用戶不得不等待它。有沒有一種方法可以發送請求,並讓我的主PHP應用程序繼續運行而無需等待來自soap服務器的響應?如果沒有,有沒有辦法在肥皂請求上設置最大超時時間,並且在請求大於最大超時時處理功能?PHP非阻塞SOAP請求

編輯: 我理想情況下希望處理這與請求的最大超時。我有以下內容:

//ini_set('default_socket_timeout', 1); 
     $streamOptions = array(
       'http'=>array(
       'timeout'=>0.01 
      ) 
    ); 

     $streamContext = stream_context_create($streamOptions); 

     $wsdl = 'file://' . dirname(__FILE__) . '/Service.wsdl'; 

     try{ 
      if (file_get_contents($wsdl)) { 

       $this->_soapClient = new SoapClient($wsdl, 
        array(
         'soap_version' => SOAP_1_2, 
         'trace' => true, 
         'stream_context' => $streamContext 
       ) 
      ); 
       $auth = array('UserName' => $this->_username, 'Password' => $this->_password); 
       $header = new SoapHeader(self::WEB_SERVICE_URL, "WSUser", $auth); 
       $this->_soapClient->__setSoapHeaders(array($header)); 

      }//if 
     } 
     catch(Exception $e){ 
     echo "we couldnt connect". $e; 
     } 
$this->_soapClient->GetUser(); 

我將超時設置爲0.01來嘗試強制連接超時,但請求似乎仍然關閉。我在這裏做錯了什麼?

+0

PHP不適合允許多個SOAP調用。 –

+1

PHP(與GTK或HTML(5)結合使用)是完全爲此設計的。 – DanFromGermany

回答

1

四種解決方案:

  1. 使用AJAX做SOAP - >Simplest SOAP example

  2. 使用AJAX調用您的服務器上做的SOAP(IMO最佳解決方案)第二PHP文件

  3. 把SOAP請求發送到你的PHP文件(S)的端部(未在豪華溶液)

  4. 使用pcntl_fork()並在第二過程所做的一切(我貶低的是,它可能無法與每個服務器的配置工作)

根據您實現這一點的方法,PHP有大量的超時配置, 例如socket_set_timeout()stream_set_timeout()http://php.net/manual/en/function.stream-set-timeout.php

2

我有同樣的問題,並已實施解決方案!

我已經實現

SoapClient::__doRequest(); 

要使用

curl_multi_exec(); 

看一看這個 asynchronous-soap