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为止。