2014-02-18 39 views
39

這對我的WAMP服務器正常工作,但不能在Linux主服務器上工作!?SOAP-ERROR:解析WSDL:無法從 - 加載WAMP

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

從PHP調用的URL將返回錯誤

$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl'); 
echo $wsdl; 

錯誤的URL

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命令行HTTP 200的URL返回一個XML響應

curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 
+1

什麼'捲曲的http:// ec.europa.eu/taxation_customs /搶答/如果你在Linux服務器上的shell中運行它checkVatService.wsdl'說? – ntaso

+1

HTTP 200和XML是響應 – clarkk

+0

聽起來像它可能是一個字符編碼問題。 SOAP客戶端期望的字符集中是否編碼了WDSL? – GordonM

回答

46

對於某些版本的PHP,SoapClient不會發送http用戶代理信息。你在服務器上使用哪些PHP版本與你的本地WAMP?

儘量明確地設置用戶代理,利用上下文來流如下:

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和缺少HTTP User Agent字符串的組合似乎給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版本默認不會添加用戶代理字符串。

+0

你說IPv6請求失敗,但沒有指定如何。如果它以503狀態碼失敗,我會刪除我的答案。我在哪裏,它說'無法連接到2001:bc8:3408:200 :: 2:網絡無法訪問' –

+0

這是正確的,請求失敗並帶有'HTTP/1.0 503服務不可用'。 503響應的文本正文是「Erreur 503 Erreur proxy ipv6」。 – Ivar

+2

鏈接到報告的SoapClient用戶代理錯誤 https://bugs.php.net/bug.php?id=60887 – Ivar

4

嘗試改變

$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服務器寫入並且未滿。

+0

它不起作用 – clarkk

+0

@clarkk小變化(加單引號),對不起。另外,'/ tmp'好嗎?另外,'phpinfo()'告訴你什麼? – klugerama

+0

另一個想法:服務器可以重定向到https嗎?您是否在請求上運行wireshark或Fiddler? – klugerama

2

503表示函數正在工作,並且您從遠程服務器獲取否認您的響應。如果您嘗試過捲曲Google結果,則會發生同樣的情況,因爲它們可以檢測到file_get_contents和cURL使用的用戶代理,並因此阻止這些用戶代理。您也可以通過訪問的服務器將其IP地址作爲此類實踐的黑名單。

主要有三個常見原因,爲什麼命令不能像遠程瀏覽器一樣工作。

1)默認的USER-AGENT被阻止。 2)您的服務器的IP塊已被阻止。 3)遠程主機有代理檢測功能。

1

此問題可能是由於禁用了libxml實體加載器引起的。

在實例化SoapClient之前嘗試運行libxml_disable_entity_loader(false);

+0

這是一個非常噁心的PHP錯誤,可能導致Linux中出現競速狀態:https: //bugs.launchpad.net/ubuntu/+source/php5/+bug/1160336 – RyanNerd

0

我使用AdWords API,有時候我也遇到同樣的問題。 我的解決方案是添加 ini_set('default_socket_timeout',900); 上的文件 供應商\ googleads \ googleads-PHP-lib中的\ src \谷歌\ ADSAPI \ AdsSoapClient.php線65

,並在 供應商\ googleads-PHP-lib中的\ src \谷歌\ ADSAPI \的Adwords \報告\ 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,有時沒有。 如果頁面連接一次,WSDL緩存將包含相同的頁面,並且程序將正常,直到代碼刷新緩存爲止...

0

對某人可能有所幫助,雖然對此沒有確切的答案題。

我的肥皂URL具有非標準端口(9087爲例),以及防火牆阻止該請求,並每次我把這個錯誤:

ERROR - 2017-12-19 20:44:11 --> Fatal Error - SOAP-ERROR: Parsing WSDL: Couldn't load from ' http://soalurl.test:9087/orawsv?wsdl ' : failed to load external entity " http://soalurl.test:9087/orawsv?wsdl "

我允許端口的防火牆和解決的錯誤!

0

試試這個。我希望它能幫助

$options = array(
    'cache_wsdl' => 0, 
    'trace' => 1, 
    'stream_context' => stream_context_create(array(
      'ssl' => array(
       'verify_peer' => false, 
       'verify_peer_name' => false, 
       'allow_self_signed' => true 
     ) 
    )) 

$client = new SoapClient(url, $options); 
相關問題