Sim*_*gro 15 php soap soap-client soapserver
使用此代码我发出肥皂请求
$client = new SoapClient('http://example.com/soap/wsdl');
try {
$result = $client->myMethod();
} catch (Exception $e) {
echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
有时(十分之一)会引发异常:
SoapFault异常:[HTTP]无法连接到主机
我的尝试
1)我寻找解决方案,我读到这个问题可能是由wsdl缓存引起的,我将其禁用php.ini:
soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0
Run Code Online (Sandbox Code Playgroud)
提出更少的例外
2)我试图添加到Windows的主机(它们在Windows上)dns的分辨率windows/system32/drivers/etc/hosts:
160.XX.XXX.XX example.com
Run Code Online (Sandbox Code Playgroud)
提出更少的例外
3)我还尝试禁用"Windows防火墙",
提出更少的例外
4)我还尝试在php.ini中增加default_socket_timeout
default_socket_timeout = 90
Run Code Online (Sandbox Code Playgroud)
什么也没有变
这个问题
服务器肥皂似乎没有问题.它也可以从其他网站使用没有问题.还有什么我可以做的吗?
我的设置
PHP 5.6
Apache 2.4
Windows Server 2012
UPDATE
经过多次测试,我认为问题出在网络上,肥皂服务器背后是反向代理,问题出现在代理中.
Dar*_*l B 17
我只想在这个步骤中添加一个可能有用的提示.它应该检查的东西除了已经写在这里的其他有用的答案.
如果从PHP 5.5或更早版本升级到PHP 5.6或PHP7 +,您可能会看到此错误.在较新版本的PHP中,soap的默认设置是验证远程对等体(以及它应该是).如果您从HTTPS提取WSDL或具有HTTPS端点,那么它将检查CA. 如果失败,您将收到此特定错误.
有两种方法可以解决这个问题.
1)最安全的选择是验证对等体.在ubuntu系统上,您可以将证书复制到root /usr/local/share/ca-certificates/并update-ca-certificates以root 身份运行.
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.
)
))
));
Run Code Online (Sandbox Code Playgroud)
我发现在SOAP方面,PHP文档有点碎片化.特别是SOAP WSSE.
您需要进一步改进调试工作:
ad 1)WSDL是否会发生很大变化?如果没有,请打开 WSDL缓存.您无需连接到服务器即可获取WSDL文件.
您提到的输出真的是在创建的echo $e->getMessage();吗?您可以在catch()块中添加一些调试代码,例如:
file_get_contents($soap_url))for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }),看看是否第二次尝试可以使其工作总而言之,"有时候错误"很难调试,所以要么你应该尝试使它重现(这将指出问题),或者你需要记录和输出尽可能多的数据,以便你可以看到问题出现在它发生的时候.
| 归档时间: |
|
| 查看次数: |
22792 次 |
| 最近记录: |