SOAP 错误:在生产服务器上解析 WSDL
当尝试利用 SoapClient 从远程 URL 解析 WSDL 时,SOAP-在生产服务器上遇到错误。本地 WAMP 服务器成功处理了该操作,但问题在生产服务器上仍然存在。
错误消息
收到的具体错误消息是:
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"
调查
经过进一步调查,发现错误是由于 SoapClient 在尝试从 URL 加载 WSDL 时无法解析 WSDL 造成的。尽管可以通过命令行使用curl 直接调用来访问WSDL,但还是发生了这种情况。
解决方案
通过在 SoapClient 中显式设置用户代理解决了该问题使用上下文流:
$soapClientOptions = array( 'stream_context' => $context, 'cache_wsdl' => WSDL_CACHE_NONE ); $client = new SoapClient($wsdlUrl, $soapClientOptions);
此方法确保请求中包含必要的 HTTP 用户代理信息,从而允许 SoapClient 成功从远程 URL 解析 WSDL。
其他见解
进一步分析显示,该问题也可能归因于生产服务器上的特定设置。通过 IPv6 的 HTTP 请求如果缺少 HTTP 用户代理字符串,似乎会触发该错误。通过强制使用 IPv4 或显式指定用户代理字符串,请求能够成功,而不会遇到 SOAP 错误。
以上是为什么我的 SoapClient 无法解析生产服务器上的 WSDL,但可以在本地服务器上运行?的详细内容。更多信息请关注PHP中文网其他相关文章!