【发布时间】:2018-07-16 09:29:59
【问题描述】:
我遇到了这个问题,我的集成脚本执行 SoapClient 请求,在我的本地开发机器上工作,但返回
'未能加载外部实体'
超时后在我们的产品服务器上。 (通过浏览器也可以)
简化代码..
$contextOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true,
'ciphers' => 'RC4-SHA',
));
$sslContext = stream_context_create($contextOptions);
// initiate the SoapClient
$options = [
// 'soap_version' => self::SOAP_VERSION,
// 'connection_timeout' => self::SOAP_CONNECTION_TIMEOUT,
'login' => $this -> getTenant() . '\\' . $this -> getUsername(),
'password' => $this -> getPassword(),
// 'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
// 'encoding' => 'UTF-8',
'verifypeer' => false,
'verifyhost' => false,
// 'soap_version' => SOAP_1_2,
'trace' => 1,
'exceptions' => 1,
'connection_timeout' => 60,
'cache_wsdl' => WSDL_CACHE_NONE,
'stream_context' => $sslContext
];
$this -> soapClient = new \SoapClient($this -> buildWsdlUrl(), $options);
以及实际的请求
$result = $this -> soapClient -> ImportGenJournalLines($ImportGenJournalLines -> getRequest());
两台机器上的配置。
> Soap Client enabled
> Soap Server enabled
>
> soap.wsdl_cache 1 1
> soap.wsdl_cache_dir /tmp /tmp
> soap.wsdl_cache_enabled 1 1
> soap.wsdl_cache_limit 5 5
> soap.wsdl_cache_ttl 86400 86400
>
> Registered PHP Streams php, file, glob, data, http, ftp, zip, compress.zlib, compress.bzip2, https, ftps, phar
服务器之间的唯一区别是 localhost 在 Apache 2.0 处理程序上运行,而 prod-server 作为服务器 API 在 FPM/FastCGI 上运行。
我尝试过使用不同的 PHP 版本(以防万一),比如 5.6、7.1 和 7.2。 localhost 在所有版本上都能完美运行,但 prod-server 会引发超时。
远程 Web 服务是 Microsoft Dynamics 服务器。
基本 SOAP 调用(用于其他集成)正常工作。
一开始我以为是缓存的问题,后来我加了一个cache-buster,改了php配置,还是没有结果。
接下来我应该检查什么配置?我们的服务器通常是“开放的”(没有限制,最新的包,纯粹用于 web 脚本),但显然我错过了导致这种情况的关键元素。
== 更新 ==
我也尝试使用我的上下文选项发送以下内容,但没有成功:
'http' => array(
'user_agent' => 'PHPSoapClient'
)
通过以下方式找到:SOAP-ERROR: Parsing WSDL: Couldn't load from - but works on WAMP
== 在底部回答了我自己的问题 ==
【问题讨论】:
-
$this -> buildWsdlUrl() 也许这会在产品上返回错误的 wsdl 路径
-
感谢您的快速回复。 buildWsdlUrl() 根据我的类中的常量返回相同的 WS-url。 (出于调试目的,脚本和变量 config 现在是相同的)。唯一的区别是我的 localhost 是从 HTTP 运行的,而 prod-server 是从 HTTPS 运行的(但如果这会导致问题,我怀疑它会是相反的方式)
标签: php server timeout soap-client