14

使用此代码我提出肥皂请求

$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)我试图将dns的分辨率添加到windows主机(它们在windows上)windows/system32/drivers/etc/hosts

160.XX.XXX.XX example.com

引发更少的异常

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

引发更少的异常

4)我也尝试增加php.ini中的default_socket_timeout

default_socket_timeout = 90

什么也没有变

问题

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

我的设置

PHP 5.6

阿帕奇 2.4

视窗服务器 2012

更新

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

4

5 回答 5

19

我只是要在这个踏板上再添加一个可能有用的提示。除了这里已经写的其他有用的答案之外,您还应该检查它。

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

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

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

2)或者您可以禁用验证heres an example of how to do it。- 这通常不是首选选项,但如果问题紧急,它可以提供快速解决方案。不过,请不要对您的安全马虎。

$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。

于 2016-06-08T23:12:27.553 回答
7

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

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

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

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

总而言之,“有时错误”很难调试,所以要么你应该尝试让它可重现(这将指向问题),要么你需要记录和输出尽可能多的数据,这样你就可以看到哪里出错了问题发生在当时。

于 2015-05-29T11:07:34.580 回答
1

您是否尝试过在浏览器中或通过 wget 或类似的方式打开 URL?然后尝试刷新无数次,看看是否出现任何错误。我的猜测是这是一个网络问题,但实际上,不稳定的网络使得调试变得非常困难......

于 2015-05-29T11:13:02.637 回答
1

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

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

于 2015-05-30T19:11:26.870 回答
0

使用它来清除脚本中的肥皂缓存:

ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
于 2017-10-16T08:41:45.580 回答