这在我的 WAMP 服务器上工作正常,但在 linux 主服务器上不起作用!?
try{
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
$result = $client->checkVat([
'countryCode' => 'DK',
'vatNumber' => '47458714'
]);
print_r($result);
}
catch(Exception $e){
echo $e->getMessage();
}
我在这里错过了什么?! :(
启用了 SOAP
错误
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"/taxation_customs/vies/checkVatService.wsdl"
从 PHP 调用 URL
从 PHP 调用 URL 返回错误
$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;
错误
Warning: file_get_contents(http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable
从命令行调用 URL
从 linux 命令行调用 URL
HTTP 200
返回一个 XML 响应curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
最佳答案
对于某些版本的 php,SoapClient 不会发送 http 用户代理信息。与本地 WAMP 相比,您在服务器上有哪些 php 版本?
尝试使用上下文流显式设置用户代理,如下所示:
try {
$opts = array(
'http' => array(
'user_agent' => 'PHPSoapClient'
)
);
$context = stream_context_create($opts);
$wsdlUrl = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
$soapClientOptions = array(
'stream_context' => $context,
'cache_wsdl' => WSDL_CACHE_NONE
);
$client = new SoapClient($wsdlUrl, $soapClientOptions);
$checkVatParameters = array(
'countryCode' => 'DK',
'vatNumber' => '47458714'
);
$result = $client->checkVat($checkVatParameters);
print_r($result);
}
catch(Exception $e) {
echo $e->getMessage();
}
编辑
实际上,您使用的 Web 服务似乎存在一些问题。 IPv6 上的 HTTP 和缺少 HTTP 用户代理字符串的组合似乎给 Web 服务带来了问题。
要验证这一点,请在您的 linux 主机上尝试以下操作:
curl -A '' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
此 IPv6 请求失败。
curl -A 'cURL User Agent' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
此 IPv6 请求成功。
curl -A '' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
curl -A 'cURL User Agent' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
这两个 IPv4 请求都成功。
有趣的案例 :) 我猜你的 linux 主机将 ec.europa.eu 解析为它的 IPv6 地址,并且你的 SoapClient 版本默认没有添加用户代理字符串。
关于php - SOAP 错误 : Parsing WSDL: Couldn't load from - but works on WAMP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21861077/