【发布时间】:2011-06-17 00:34:43
【问题描述】:
我的 php 页面出现以下异常。
SoapFault 异常:[HTTP] 获取 http 标头时出错
我阅读了几篇文章,发现 default_socket_timeout 需要配置。 所以我设置如下。 default_socket_timeout = 480
我仍然遇到同样的错误。有人可以帮帮我吗?
【问题讨论】:
我的 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 - 键 stream_context 作为 SoapClient 的参数),但是 SoapClient does not support changing the Connection header(更新: 这个错误是已在 PHP 5.3.11 版中解决)。
另一个解决方案是implement your own __doRequest()。在提供的链接上,一个人使用Curl 发送请求。这将使您的 PHP 应用程序依赖于Curl。该实现还缺少保存请求/响应标头等功能。
第三种解决方案是在收到响应后立即关闭连接。这可以通过在__doRequest()、__call() 或__soapCall() 中将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 尝试了以下操作。
$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异常。
【讨论】: