在 SoapClient 中获取 http 标头时出错

2022-08-30 09:51:28

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

获取 http 标头时出错

使用 PHP5 SoapClient;我可以通过做来获取函数列表,但是当我调用时,我总是得到这个错误。$client->__getFunctions()$client->myFunction(...)

我在谷歌上搜索并发现在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);
    }
}

始终以错误结尾。

如何解决问题?


答案 1

当 SOAP 响应的值超过该值时,经常会出现此错误。(请参阅此链接default_socket_timeout

SoapClient 构造函数中的注意事项:该选项用于定义连接到服务的超时值,而不是其响应的超时值。connection_timeout

你可以像这样增加它:

ini_set('default_socket_timeout', 600); // or whatever new value you want

这应该会告诉您超时是否是问题所在,或者您是否有其他问题。请记住,您不应将其用作永久解决方案,而应查看它是否摆脱了错误,然后再继续调查 SOAP 服务响应速度如此之慢的原因。如果服务始终如此缓慢,则可能必须考虑脱机/批处理。


答案 2

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

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

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

openssl s_client -connect <web service host>:<port>

我知道这不会是每个人问题的答案,但希望它能帮助别人。无论哪种方式,我认为重要的是要意识到此错误的原因(错误代码:“HTTP”错误字符串:“错误获取http标头”)通常是网络/套接字/协议/通信问题,而不仅仅是“没有为请求留出足够的时间”。我无法想象扩展default_socket_timeout值会经常解决这个问题,即使它确实如此,当然最好首先解决为什么它这么慢的问题。


推荐