发送的PHP curl请求没有标头

时间:2014-10-07 15:50:47

标签: php curl soap

我真的很感谢你的帮助。我在这个问题上无处可去。

从这里开始是工作代码

$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);
}

我还尝试将头部声明从options数组中拉出来并使用

执行
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

在curl_setopt_array()之后....没有运气。

有什么想法吗?我不知道最近会发生什么。

1 个答案:

答案 0 :(得分:0)

使用curl时,不使用parent :: __ doRequest,因此soapClient无法跟踪您的请求。

您的代码会让您觉得使用curl是因为您认为SoapClient无法设置请求超时。 那不对。

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

  

connection_timeout选项定义了以秒为单位的超时   与SOAP服务的连接。此选项未定义超时   对于响应缓慢的服务。限制等待通话的时间   完成default_socket_timeout设置是可用的。