我遇到了这样的问题:我的集成脚本(执行SoapClient请求)可以在我的本地dev-machine上运行,但是返回
超时后,在我们的产品服务器上“无法加载外部实体”
。 (通过浏览器也可以使用)
简化代码..
$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
服务器之间的唯一区别是,本地主机运行在Apache 2.0处理程序上,而生产服务器运行在FPM / FastCGI上作为服务器API。
我尝试使用不同的PHP版本(以防万一有些不同),例如5.6、7.1和7.2。本地主机可以在所有版本上完美运行,但是prod服务器会抛出超时。
远程Web服务是Microsoft Dynamics服务器。
(用于其他集成的)基本SOAP调用正常工作。
起初,我认为这是由于缓存造成的,但是后来我添加了一个缓存破坏器并更改了php配置,但没有结果。
接下来我应该检查什么配置?我们的服务器通常是“开放的”(无限制,软件包是最新的,仅用于Web脚本),但是显然我缺少导致此问题的关键元素。
==更新==
我也尝试通过上下文选项发送以下内容,但没有成功:
'http' => array(
'user_agent' => 'PHPSoapClient'
)
通过以下网址找到:SOAP-ERROR: Parsing WSDL: Couldn't load from - but works on WAMP
==在底部回答了我自己的问题==
答案 0 :(得分:0)
发现了问题。这种情况的原因很明显。也许如果我将URL张贴在这里,你们会指出来的(对我来说很愚蠢)。
显然,我们的服务器通过我们的提供商提供了一个顶层共享防火墙,并且该端口(远程Web服务在其上运行的端口8002)被阻止用于传出连接。
我已经联系了我们的提供商,他们开放了该端口,并且现在一切正常。