在這種情況下,個人會遇到在Linux 伺服器上使用SOAP 用戶端時出現的問題。雖然程式碼在WAMP 伺服器上完美運行,但它失敗並顯示一條錯誤訊息,指出「SOAP-ERROR:正在解析WSDL:無法載入。」
根本問題,如據知情人士透露,問題在於SoapClient在特定PHP版本中不傳送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);
受訪者進一步觀察到相關網路服務表現出特殊的行為。在沒有用戶代理字串的情況下透過 IPv6 發出的請求會失敗,而使用 IPv4 或用戶代理字串發出的請求會成功。這顯示 Web 服務的配置有潛在問題。
為了驗證這一點,受訪者示範了使用和不使用使用者代理字串發出HTTP 請求時的行為差異:
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
(成功)
最終,該問題源於IPv6 HTTP 請求、SoapClient 中不充分的用戶代理資訊以及Web 服務本身的潛在缺陷。
以上是為什麼我的 SOAP 用戶端可以在 WAMP 上執行,但在 Linux 上卻失敗並出現「SOAP-ERROR: Parsing WSDL: Couldn't load from」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!