使用此代码我发出肥皂请求
$client = new SoapClient('http://example.com/soap/wsdl');
try {
$result = $client->myMethod();
} catch (Exception $e) {
echo $e->getMessage();
}
有时(十分之一),会引发异常:
SoapFault异常:[HTTP]无法连接到主机
My attempts
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
什么也没有变
The question
服务器肥皂似乎没有问题 . 它也可以从其他网站使用没有问题 . 还有什么我可以做的吗?
My settings
PHP 5.6 Apache 2.4 Windows Server 2012
UPDATE
经过多次测试,我认为问题出在网络上,肥皂服务器背后是反向代理,问题出现在代理中 .
5 回答
请检查服务器上是否保持活动状态并尝试更改其参数 . WSDL提取和请求发送之间的连接可能存在问题 .
如果WSDL文件永远不会更改,您可以尝试禁用并检查是否再次发生此错误 . 只需将wsdl设置为null并设置location和uri即可 .
您需要进一步改进调试工作:
ad 1)WSDL是否会发生很大变化?如果没有,请打开WSDL缓存 . 您无需连接到服务器即可获取WSDL文件 .
你提到的输出真的是在_585860中创建的吗?您可以在
catch()
块中添加一些调试代码,例如:检查是否可以用其他方式连接服务器(例如
file_get_contents($soap_url)
)如果没有,请检查您获得的错误类型
打印时间并检查SOAP服务器上的错误日志
a 403服务器上出现问题的禁止或类似错误点
a无法将错误点连接到网络问题(不是唯一的,但机会更高)
你可以尝试把它放在一个循环中(类似于
for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }
的行),看看是否第二次尝试会使它工作总而言之,“有时候错误”很难调试,所以要么你应该尝试使它重现(这将指出问题),或者你需要记录和输出尽可能多的数据,这样你就可以看到问题出现在它发生的时候 .
我只想在这个步骤中添加一个可能有用的提示 . 它应该检查的东西除了已经写在这里的其他有用的答案 .
如果从PHP 5.5或更早版本升级到PHP 5.6或PHP7,您可能会看到此错误 . 在较新版本的PHP中,soap的默认设置是验证远程对等体(以及它应该是) . 如果您从HTTPS提取WSDL或具有HTTPS endpoints ,那么它将检查CA.如果失败,您将收到此特定错误 .
有两种方法可以解决这个问题 .
1)最安全的选择是验证对等体 . 在ubuntu系统上,您可以将证书复制到
/usr/local/share/ca-certificates/
并以root身份运行update-ca-certificates
.2)或者你可以禁用验证,这是一个如何做的例子 . - 这通常不是首选方案,但如果问题紧急,它可以提供快速解决方案 . 不过,请不要马虎与你的安全 .
我发现在SOAP方面,PHP文档有点碎片化 . 特别是SOAP WSSE .
您是否尝试在浏览器中或通过wget或类似的东西打开URL?然后尝试刷新数十万次,看看是否有任何错误发生 . 我的猜测是这是一个网络问题,但实际上,一个不稳定的网络使得调试非常困难......
使用此选项清除脚本中的soap缓存: