SOAP-ERROR:parsingWSDL:无法从 – 加载WAMP
这对我的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用户代理信息。 你在服务器上有什么样的PHP版本与你当地的WAMP?
尝试使用上下文stream来显式设置用户代理,如下所示:
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服务的一些问题。 HTTP over IPv6和缺lessHTTP User Agentstring的组合似乎给Web服务带来了问题。
要validation这一点,请在您的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主机parsingec.europa.eu到它的IPv6地址,并且您的SoapClient版本默认情况下不添加用户代理string。
尝试改变
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
至
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true, 'cache_wsdl' => WSDL_CACHE_MEMORY]);
另外(无论是否有效),请检查以确保/tmp
可由您的Web服务器写入,并且未满。
503意味着这些function正在工作,并且您正在从远程服务器获得拒绝您的响应。 如果您曾经尝试过curlGoogle结果,则会发生同样的情况,因为它们可以检测到file_get_contents和cURL使用的用户代理,并因此阻止这些用户代理。 也有可能你正在访问的服务器也有这样的做法的IP地址blackballed。
主要有三个常见的原因,为什么命令不能像远程浏览器一样工作。
1)默认的USER-AGENT被阻止。 2)您的服务器的IP块已被阻止。 3)远程主机有一个代理检测。
这个问题可能是由于libxml实体加载器被禁用导致的。
尝试运行libxml_disable_entity_loader(false);
在实例化SoapClient
之前。
我使用AdWords API,有时候我也遇到同样的问题。 我的解决scheme是添加ini_set('default_socket_timeout',900); 在文件vendor \ googleads \ googleads-php-lib \ src \ Google \ AdsApi \ AdsSoapClient.php第65行
('default_socket_timeout',900);在供应商\ googleads-php-lib \ src \ Google \ AdsApi \ Adwords \ Reporting \ v201702 \ ReportDownloader.php行126 ini_set('default_socket_timeout',900); $ requestOptions ['stream_context'] ['http'] ['timeout'] =“900”;
Google软件包会覆盖默认的php.ini参数。
有时,该页面可能会连接到“ https://adwords.google.com/ap i / adwords / mcm / v201702 / ManagedCustomerService?wsdl,有时不会。 如果页面连接一次,那么WSDLcaching将包含相同的页面,程序将会正常,直到代码刷新caching为止。