在SoapClient中获取http标头时出错

Cri*_*ris 41 php soap-client

我正在尝试在远程主机上调用WS over https:远程端口,我得到:

获取http标头时出错

使用PHP5 SoapClient; 我可以通过这样做得到功能列表$client->__getFunctions()但是当我打电话时$client->myFunction(...)我总是得到这个错误.

我用Google搜索并发现在php.ini中增加了default_socket_timeout,但它没有用.

谁能建议我一个解决方案?

编辑:这是代码:

$wsdl="myWSDL";

$client = new SoapClient($wsdl,array('connection_timeout'=>5,'trace'=>true,'soap_version'=>SOAP_1_2));

var_dump($client->__getFunctions());

try {
    $response=$client->myFunction("1","2","3");
         } catch (SoapFault $fault) {
    var_dump($fault);
    }
}
Run Code Online (Sandbox Code Playgroud)

}

......总是有错.

cmb*_*ley 58

default_socket_timeoutSOAP响应超过该值时,通常会出现此错误.(见此链接.)

来自SoapClient构造函数的注释:该connection_timeout选项用于定义连接到服务的超时值,而不是用于响应的超时.

您可以像这样增加它:

ini_set('default_socket_timeout', 600); // or whatever new value you want
Run Code Online (Sandbox Code Playgroud)

这应该告诉您超时是否是问题,或者您是否有其他问题.请记住,您不应该将此作为永久解决方案,而是在继续调查SOAP服务响应速度这么慢之前,先查看它是否消除了错误.如果服务一直很慢,则可能必须考虑脱机/批处理.

  • 老实说,是否有一种情况,你想让用户坐在那里等待*600秒*的回复?到目前为止,我已经发现了3个有关此问题的stackoverflow帖子,并且人们一直建议"增加时间限制".毫不奇怪,答案没有被接受.我还没有解决这个问题,但我怀疑这是一个网络/套接字相关的问题,通常会导致这个问题. (4认同)
  • 我试图将它增加到 600,但总是得到 ["faultstring"]=> string(27) "Error Fetching http headers" (2认同)

Man*_*chi 10

只是想在我的具体情况下分享这个问题的解决方案(我有相同的症状).在我的场景中,结果证明Web服务提供的ssl证书不再受信任.它实际上是由于客户端安装的新防火墙干扰了SOAP请求,但最终结果是证书未正确提供/信任.

跟踪有点困难,因为SoapClient调用(即使是trace = 1)也没有提供非常有用的反馈.

我能够通过使用以下方式证明不受信任的证书:

openssl s_client -connect <web service host>:<port>
Run Code Online (Sandbox Code Playgroud)

我知道这不是每个人的问题的答案,但希望它可以帮助某人.无论哪种方式,我认为重要的是要意识到这个错误的原因(faultcode:"HTTP"faultstring:"Error Fetching http headers")通常会成为网络/套接字/协议/通信问题而不是简单地"不允许请求的时间".我无法想象扩展default_socket_timeout值会经常解决这个问题,即使它确实如此,最好解决为什么它首先这么慢的问题.


小智 8

我想现在为时已晚,但我遇到了同样的问题.我尝试套接字超时,但它不起作用.我的问题是客户端和服务器在同一个物理服务器中.由于客户端代码在同一个物理服务器上工作,我得到了这个错误,但是,同一客户端代码移动到我的localhost,请求服务器,(客户端和服务器在两个不同的机器中执行)一切正常.

也许这可以帮助别人!


San*_*ani 8

我遇到了同样的问题并尝试了上述所有解决方案。可悲的是没有任何效果。

  1. 套接字超时(无效)
  2. 用户代理(无效)
  3. SoapClient 配置、cache_wsdlKeep-Alive等...

我通过添加压缩标头属性解决了我的问题。当您期待gzip压缩格式的响应时,这实际上是必需的。

//set the Headers of Soap Client. 
$client = new SoapClient($wsdlUrl, array(
    'trace' => true, 
    'keep_alive' => true,
    'connection_timeout' => 5000,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'compression'   => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | SOAP_COMPRESSION_DEFLATE,
));
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

祝你好运。


小智 5

对我有用的配置是在我的 php 脚本中定义以下参数:

ini_set('default_socket_timeout', 5000);
$client = new \SoapClient($url,array(
    'trace' =>true,
    'connection_timeout' => 5000,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'keep_alive' => false,
));
Run Code Online (Sandbox Code Playgroud)

请给出意见。

根据我对这个问题的经验,最重要的参数定义是

ini_set('default_socket_timeout', '5000');
Run Code Online (Sandbox Code Playgroud)

在我的测试期间,我将 default_socket_timeout 定义为 5 秒,并且立即引发错误“获取 http 标头时出错”。

我希望它能帮助你!


小智 5

设置'keep_alive'为false对我有用:

new SoapClient($api_url, array('keep_alive' => false));
Run Code Online (Sandbox Code Playgroud)