繁体   English   中英

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

[英]SoapFault exception: [HTTP] Error Fetching http headers

我在php页面中遇到异常。

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

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

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

我一直收到Error fetching http headers有两个原因:

  1. 服务器需要很长时间才能回答。
  2. 服务器不支持Keep-Alive连接(我的答案涵盖)。

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 - key stream_context作为SoapClient参数),但是SoapClient不支持更改Connection头更新:这个bug在PHP版本5.3.11中得到了解决) )。

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

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

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

我遇到了同样的问题,并通过禁用keep_alive尝试了以下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

我在Web服务中的一个过程是花费很长时间来执行。 因此我得到了soapfault的例外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM