我在php页面中遇到异常。
SoapFault异常:[HTTP]错误获取http标头
我阅读了几篇文章,发现default_socket_timeout需要配置。 所以我把它设置如下。 default_socket_timeout = 480
我仍然得到同样的错误。有人可以帮助我吗?
答案 0 :(得分:29)
我得到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
- 密钥stream_context
作为SoapClient
的参数),但是SoapClient
does not support changing the Connection header(更新:这个错误在PHP版本5.3.11中已解决)。
另一个解决方案是implement your own __doRequest()
。在提供的链接上,一个人使用Curl
发送请求。这将使您的PHP应用程序依赖于Curl
。该实现还缺少保存请求/响应头等功能。
第三种解决方案是在收到响应后立即关闭连接。这可以通过在httpsocket
,NULL
或__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的例外。