【问题标题】:SoapFault exception: [HTTP] Error Fetching http headersSoapFault 异常:[HTTP] 获取 http 标头时出错
【发布时间】:2011-06-17 00:34:43
【问题描述】:

我的 php 页面出现以下异常。

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

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

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

【问题讨论】:

    标签: php exception soap


    【解决方案1】:

    我收到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 - 键 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;
        }
    }
    

    【讨论】:

    • 从 PHP 5.4 开始,这个标志现在可用:keep_alive 选项是一个布尔值,定义是发送 Connection: Keep-Alive 标头还是 Connection: close。 (php.net/manual/en/soapclient.soapclient.php)
    • 需要关闭keepalive来避免这种情况似乎很可惜;我可能误解了一些事情,但服务器响应不应该表明连接可以保持多长时间,然后 SoapClient 应该知道在超时后不要重用它(理想情况下,透明地重新连接)?
    • “服务器不支持 Keep-Alive 连接(我的回答涵盖)。”。我正在与之交谈的服务器有问题。它没有正确处理 Keep-Alive 连接,我不得不将其关闭。
    【解决方案2】:

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

    【讨论】:

    • 这意味着将为每个请求获取 wsdl。坏主意和巨大的性能损失。
    【解决方案3】:

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

    【讨论】:

    • 你解决了这个问题?我正在尝试增加超时,但它没有帮助:(。谢谢
    • 这确实不能回答问题。
    猜你喜欢
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多