![](/img/trans.png)
[英]Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers
[英]SoapFault exception: [HTTP] Error Fetching http headers
我在php页面中遇到异常。
SoapFault异常:[HTTP]错误获取http标头
我读了几篇文章,发现default_socket_timeout需要配置。 所以我把它设置如下。 default_socket_timeout = 480
我仍然得到同样的错误。 有人可以帮我吗?
我一直收到Error fetching http headers
有两个原因:
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.