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

时间:2015-05-23 08:38:04

标签: php soap soap-client soapserver

使用此代码我制作肥皂请求

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

try {
    $result = $client->myMethod();
} catch (Exception $e) {
    echo $e->getMessage();
}

有时(十分之一)会引发异常:

  

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

我的尝试

1)我查找了解决方案,I read此问题可能是由wsdl缓存引起的,我在php.ini中禁用了它:

soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0

提出更少的例外

2)我试图在windows/system32/drivers/etc/hosts中添加到Windows的主机(它们在Windows上)dns的分辨率:

160.XX.XXX.XX example.com

提出更少的例外

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

提出更少的例外

4)我还尝试在php.ini

中增加default_socket_timeout
default_socket_timeout = 90

一切都没有改变

问题

服务器soap似乎没有问题。它也可以从其他站点使用而没有问题。还有什么我可以做的吗?

我的设置

  

PHP 5.6

     

Apache 2.4

     

Windows Server 2012

更新

经过多次测试,我认为问题出在网络上,肥皂服务器是在反向代理后面,问题出现在代理中。

5 个答案:

答案 0 :(得分:17)

我只想在这个步骤中添加一个可能有用的提示。它应该检查的东西除了已经写在这里的其他有用的答案。

如果从PHP 5.5或更早版本升级到PHP 5.6或PHP7 +,您可能会看到此错误。在较新版本的PHP中,soap的默认设置是验证远程对等体(以及它应该是)。如果您从HTTPS提取WSDL或具有HTTPS端点,那么它将检查CA.如果失败,您将收到此特定错误。

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

1)最安全的选择是验证对等体。在ubuntu系统上,您可以将证书复制到/usr/local/share/ca-certificates/并以root身份运行update-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.
        )
    ))
 ));

我发现在SOAP方面,PHP文档有点碎片化。特别是SOAP WSSE。

答案 1 :(得分:7)

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

ad 1)WSDL是否发生了很大变化?如果没有,打开 WSDL缓存。您无需连接到服务器即可获取WSDL文件。

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

  • 检查您是否可以通过其他方式连接到服务器(例如file_get_contents($soap_url)
  • 如果没有,请检查您获得的错误类型
    • 打印时间并检查SOAP服务器上的错误日志
    • a 403 Forbidden 或服务器上的问题的类似错误点
    • a 无法连接错误指向网络问题(不是唯一的,但机会更高)
  • 您可以尝试将其置于一个循环中(类似于for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }的内容)以查看是否第二次尝试可以使其正常工作

总而言之,“有时候错误”很难调试,所以要么你应该尝试使它重现(这将指出问题),或者你需要记录和输出尽可能多的数据,这样你就可以看看问题发生时的位置。

答案 2 :(得分:1)

您是否尝试过在浏览器中打开网址或通过wget或类似内容打开网址?然后尝试刷新数十万次,看看是否有任何错误发生。我的猜测是这是一个网络问题,但实际上,一个不稳定的网络使得调试非常困难......

答案 3 :(得分:1)

请检查服务器上是否保持活动状态并尝试更改其参数。这可能是WSDL提取和请求发送之间的连接问题。

如果WSDL文件永远不会更改,您可以尝试禁用并检查是否再次出现此错误。只需将wsdl设置为null并设置location和uri。

答案 4 :(得分:0)

使用此选项清除脚本中的soap缓存:

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