【问题标题】:SoapClient - Timeout - failed to load external entity (but works on localhost)SoapClient - 超时 - 无法加载外部实体(但适用于 localhost)
【发布时间】: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


【解决方案1】:

发现问题。这种情况的原因很明显。也许如果我在这里发布 URL,你们会指出这一点(我真傻)。

显然,我们的服务器通过我们的提供商有一个顶级共享防火墙,并且端口(远程 Web 服务正在运行的端口 8002)被阻止用于传出连接。

我已经联系了我们的供应商,他们打开了那个端口,现在一切运行良好..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2012-05-06
    • 2012-01-03
    • 2016-11-30
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多