SoapFault异常:[HTTP]错误获取http标头

时间:2011-01-28 04:19:58

标签: php exception soap

我在php页面中遇到异常。

SoapFault异常:[HTTP]错误获取http标头

我阅读了几篇文章,发现default_socket_timeout需要配置。 所以我把它设置如下。 default_socket_timeout = 480

我仍然得到同样的错误。有人可以帮助我吗?

3 个答案:

答案 0 :(得分:29)

我得到Error fetching http headers有两个原因:

  1. 服务器需要很长时间才能回答。
  2. 服务器不支持Keep-Alive连接(我的回答涵盖了这些连接)。
  3. PHP将始终尝试通过发送Connection: Keep-Alive HTTP标头来使用与Web服务的持久连接。如果服务器总是关闭连接但尚未完成(PHP没有收到EOF),那么当PHP尝试重用已在服务器端关闭的连接时,您可以获得Error fetching http headers

    注意:只有当同一个SoapClient对象发送多个请求且频率较高时,才会出现此情况。发送Connection: close HTTP标头以及第一个请求将修复此问题。

    在PHP 5.3.5版(目前随Ubuntu提供)中,SoapClient不支持设置HTTP头Connection: Close。一个人应该能够在流上下文中发送HTTP标头(使用$option - 密钥stream_context作为SoapClient的参数),但是SoapClient does not support changing the Connection header更新:这个错误在PHP版本5.3.11中已解决)。

    另一个解决方案是implement your own __doRequest()。在提供的链接上,一个人使用Curl发送请求。这将使您的PHP应用程序依赖于Curl。该实现还缺少保存请求/响应头等功能。

    第三种解决方案是在收到响应后立即关闭连接。这可以通过在httpsocketNULL__doRequest()中将SoapClients属性__call()设置为__soapCall()来完成。 __call()的示例:

    class MySoapClient extends SoapClient {
        function __call ($function_name , $arguments) {
            $response = parent::__call ($function_name , $arguments);
            $this->httpsocket = NULL;
            return $response;
        }
    }
    

答案 1 :(得分:1)

我遇到了同样的问题,并通过停用keep_alive来尝试以下内容。

$api_proxy = new SoapClient($api_url, array('trace' => true, 'keep_alive' => false));

但是,这对我没有用。对我有用的是禁用SOAP缓存。它似乎缓存了错误的请求,在禁用后我实际上注意到我的请求执行得更快。

在Linux服务器上,您可以在/etc/php.ini文件中找到它。

查找soap.wsdl_cache_enabled=1并将其更改为soap.wsdl_cache_enabled=0

别忘了重装apache。 service httpd reload

答案 2 :(得分:-10)

我在Web服务中的一个过程需要很长时间才能执行。 因此我得到了soapfault的例外。