2014-10-07 116 views
0

我真的很感謝你的幫忙。在這個問題上我沒有得到任何答案。正在發送沒有標題的PHP curl請求

要開始在這裏工作的代碼

$client = new SoapClient("/var/www/$schema/$space.wsdl", array('trace' => 1)); 
try { 
    $result = $client->$service($request); 
} 
catch (SoapFault $soapFault) { 
    //print_r($soapFault); 
    echo "ERROR: ". $client->__getLastRequestHeaders(); 
    exit(); 
} 
echo "SUCCESS: ". $client->__getLastRequestHeaders(); 
exit(); 

我得到相應的數據從SOAP調用和上面的代碼輸出回...

SUCCESS: POST /server/ws/r/customer HTTP/1.1 
Host: soap.server.com 
Connection: Keep-Alive 
User-Agent: PHP-SOAP/5.3.3 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "" 
Content-Length: 287 

現在,當我試圖擴展SoapClient的(添加重試和超時)

include_once("/var/www/object/soapTest.php"); 
$client = new SoapTest("/var/www/$schema/$space.wsdl", array('trace' => 1,'timeout' => $timeout_length,'connecttimeout' => $timeout_length)); 
try { 
    $result = $client->$service($request); 
} 
catch (SoapFault $soapFault) { 
    //print_r($soapFault); 
    echo "ERROR: ". $client->__getLastRequestHeaders(); 
    exit(); 
} 
echo "SUCCESS: ". $client->__getLastRequestHeaders(); 
exit(); 

我得到的只是錯誤:沒有其他信息。所以,我已經嘗試了兩種第三方庫的SoapClient的......都具有相同的結果擴展:

https://github.com/ideaconnect/idct-soap-client/blob/master/src/client.php

https://gist.github.com/RobThree/2490351

我當前的代碼如下:

public function __doRequest($request, $location, $action, $version, $one_way = FALSE) 
{ 
    if (($this->timeout===0) && ($this->connecttimeout===0)) 
    { 
     // Call via parent because we require no timeout 
     $response = parent::__doRequest($request, $location, $action, $version, $one_way); 
    } 
    else 
    { 
     // Call via Curl and use the timeout 
     $curl = curl_init($location); 
     if ($curl === false) 
      throw new Exception('Curl initialisation failed'); 

     $header = array("Content-Type:text/xml;charset=utf-8","User-Agent:PHP-SOAP/5.3.3","SOAPAction:\"".$action."\""); 

     $options = array(
      CURLOPT_VERBOSE => false, 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_POST => true, 
      CURLOPT_POSTFIELDS => $request, 
      CURLOPT_HEADER => true, 
      CURLOPT_NOSIGNAL => false 
      CURLOPT_HTTPHEADER => $header 
      //CURLOPT_SSL_VERIFYPEER => $this->sslverifypeer 
     ); 
     //print_r($options); 
     //exit(); 

     if ($this->timeout>0) { 
      if (defined('CURLOPT_TIMEOUT_MS')) { //Timeout in MS supported? 
       $options[CURLOPT_TIMEOUT_MS] = $this->timeout; 
      } else { //Round(up) to second precision 
       $options[CURLOPT_TIMEOUT] = ceil($this->timeout/1000); 
      } 
     } 

     if ($this->connecttimeout>0) { 
      if (defined('CURLOPT_CONNECTTIMEOUT_MS')) { //ConnectTimeout in MS supported? 
       $options[CURLOPT_CONNECTTIMEOUT_MS] = $this->connecttimeout; 
      } else { //Round(up) to second precision 
       $options[CURLOPT_CONNECTTIMEOUT] = ceil($this->connecttimeout/1000); 
      } 
     } 

     if (curl_setopt_array($curl, $options) === false) 
      throw new Exception('Failed setting CURL options'); 

     curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 

     $response = curl_exec($curl); 
     if (curl_errno($curl)){ 
      throw new Exception(curl_error($curl)); 
     } 
     curl_close($curl); 
    } 

    // Return? 
    if (!$one_way) 
     return ($response); 
} 

並且我也嘗試將標題聲明從選項數組中拉出來,並使用

curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 

後curl_setopt_array()....沒有運氣。

任何想法?我不知道發生了什麼事。

回答

0

當您使用curl時,您不使用parent :: __ doRequest,因此soapClient無法跟蹤您的請求。

您的代碼讓人覺得您使用curl是因爲您認爲SoapClient無法設置請求超時。 這是不對的。

http://php.net/manual/en/soapclient.soapclient.php

The connection_timeout option defines a timeout in seconds for the connection to the SOAP service. This option does not define a timeout for services with slow responses. To limit the time to wait for calls to finish the default_socket_timeout setting is available.