首页 >后端开发 >php教程 >为什么我的 SoapClient 无法解析生产服务器上的 WSDL,但可以在本地服务器上运行?

为什么我的 SoapClient 无法解析生产服务器上的 WSDL,但可以在本地服务器上运行?

Barbara Streisand
Barbara Streisand原创
2024-11-09 20:50:02416浏览

Why does my SoapClient fail to parse a WSDL on the production server but works on my local server?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn