在 Linux 主服务器上,SoapClient 无法解析来自给定 URL 的 WSDL,导致错误:“SOAP-ERROR: Parsing WSDL: Couldn't load from - 但适用于 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中文网其他相关文章!