PHP SoapClient:SoapFault异常无法连接到主机

PHP SoapClient:SoapFault异常无法连接到主机,php,soap,soap-client,soapserver,Php,Soap,Soap Client,Soapserver,使用此代码,我可以发出soap请求 $client = new SoapClient('http://example.com/soap/wsdl'); try { $result = $client->myMethod(); } catch (Exception $e) { echo $e->getMessage(); } 有时(十分之一),会引发异常: SoapFault异常:[HTTP]无法连接到主机 我的尝试 1) 我寻找解决方案,并且这个问题可能是由wsd

使用此代码,我可以发出soap请求

$client = new SoapClient('http://example.com/soap/wsdl');

try {
    $result = $client->myMethod();
} catch (Exception $e) {
    echo $e->getMessage();
}
有时(十分之一),会引发异常:

SoapFault异常:[HTTP]无法连接到主机

我的尝试

1) 我寻找解决方案,并且这个问题可能是由wsdl缓存引起的,我在
php.ini
中禁用了它:

soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0
引发的异常更少

2) 我试图在windows主机(它们位于windows上)中添加
windows/system32/drivers/etc/hosts
中的dns解析:

160.XX.XXX.XX example.com
引发的异常更少

3) 我还试图禁用“Windows防火墙”

引发的异常更少

4) 我还尝试增加php.ini中的默认\u套接字\u超时

default_socket_timeout = 90
一切都没有改变

问题

服务器soap似乎没有问题。它在其他站点使用时也没有问题。还有什么我能做的吗

我的设置

PHP5.6

Apache2.4

Windows Server 2012

更新


经过多次测试,我认为问题出在网络中,soap服务器位于反向代理之后,问题出现在代理中。

您需要进一步改进调试工作:

ad 1)WSDL变化很大吗?如果不是,则启用WSDL缓存。您不需要连接到服务器来获取WSDL文件

您提到的输出真的是在
echo$e->getMessage()中创建的吗?您可以在
catch()
块中添加一些调试代码,例如:

  • 检查是否可以通过其他方式连接到服务器(例如
    文件\u获取\u内容($soap\u url)
  • 如果没有,请检查您遇到的错误类型
    • 打印时间并检查SOAP服务器上的错误日志
    • 服务器上出现问题时出现403禁止或类似错误点
    • a无法将错误点连接到网络问题(不完全是这样,但可能性更高)

  • 你可以试着把它放在一个循环中(类似于($i=0;$i您是否尝试过在浏览器中或通过wget或类似方式打开URL?然后尝试刷新无数次,看看是否出现任何错误。我猜这是网络问题,但事实上,不稳定的网络使调试变得非常困难…

    请检查服务器上的keep alive是否处于活动状态,并尝试更改其参数。可能是WSDL获取和请求发送之间的连接有问题


    如果WSDL文件从未更改,您可以尝试禁用并检查此错误是否再次发生。只需将WSDL设置为null并设置位置和uri。

    我只想在此步骤中添加一个可能有用的提示。除了此处已编写的其他有用答案之外,您还应该检查此提示

    如果从PHP5.5或更早版本升级到PHP5.6或PHP7+,则可能会看到此错误。在较新版本的php中,soap的默认设置是验证远程对等方(应该是这样)。如果从HTTPS中提取WSDL或具有HTTPS端点,则它将检查CA。如果失败,则会出现此特定错误

    有两种方法可以解决这个问题

    1) 最安全的选择是验证对等方。在ubuntu系统上,您可以将证书复制到
    /usr/local/share/ca certificates/
    ,并以root用户身份运行
    更新ca certificates

    2) 或者你可以禁用验证,这是一个如何进行验证的示例。-这通常不是首选选项,但是如果问题很紧急,它可以提供快速修复。不过,请不要草率地使用你的安全性

    $soapClient = new SoapClient($wsdl_url, array(
        //'trace' => 1,
        'stream_context' => stream_context_create(array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false, 
                'allow_self_signed' => true //can fiddle with this one.
            )
        ))
     ));
    

    我发现PHP文档在谈到SOAP时有点支离破碎。尤其是SOAP WSSE。

    用它来清除脚本中的SOAP缓存:

    ini_set('soap.wsdl_cache_enabled',0);
    ini_set('soap.wsdl_cache_ttl',0);
    

    Soapfault异常是一个异常,因此有一个方法->getMessage()这可能会告诉你SoapFault是什么?@NicholasAlexander是的,我改变了我的问题,让它更清楚。这可能会帮助你有防病毒软件吗?这似乎是网络问题,所以你可以输入另一个
    catch
    尝试,看看它是否也失败。如果你在同一网络中有另一台服务器k、 您可以尝试从它发出相同的SOAP请求,看看会发生什么。可能是TTL没有通过。请检查文档中有关WSDL缓存的注释:。基本上,更改设置直到时间过去才有效。经过多次测试,我认为问题出在网络中,SOAP服务器位于反向代理之后,问题是em出现在代理中。谢谢你的帮助真棒!谢谢老兄!同样的问题在这里,这解决了问题,我首先在中找到它(回答为“renky”)