在Linux 主伺服器上,SoapClient 無法解析來自給定WSDL,導致錯誤:「SOAP-錯誤:正在解析WSDL:無法載入- 但適用於WAMP」。但是,直接呼叫 URL 或從命令列使用curl 會傳回預期的 XML 回應。
缺少用戶代理字串:
For對於某些版本的PHP,SoapClient 預設情況下可能不會發送HTTP 用戶代理資訊.這可能會導致正在使用的 Web 服務出現問題。
解決方案:
使用上下文流明確設定用戶代理:
$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);
Web 服務問題:
此外,我們發現相關Web 服務在沒有使用者代理字串的IPv6 請求方面存在問題。要驗證這一點,請在 Linux 主機上嘗試以下命令:
curl -A '' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl curl -A 'cURL User Agent' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 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
沒有用戶代理的 IPv6 請求將失敗,而所有其他請求將成功。這表示 Linux 主機正在將 Web 服務的網域解析為其 IPv6 位址,並且 SoapClient 預設情況下未新增使用者代理字串。
以上是為什麼我的 SoapClient 在 Linux 上無法解析 WSDL,但在 WAMP 上卻可以?的詳細內容。更多資訊請關注PHP中文網其他相關文章!