1

我已经为这个问题苦苦挣扎了几个月,所以我决定寻求帮助。在我们当前的项目中,我们使用多个 Web 服务与外部服务器进行通信。其中一个处理大量数据,soap call 需要很长时间。某些方法调用最多需要 5-10 秒。

我们可以处理这样的时间,问题出在别处。我们正在使用非常强大的机器来托管我们的应用程序(专用,6 个氙气处理器,16 gb ram 内存)。当我们调用外部 WS 并且服务器监听响应时,CPU 使用峰值非常大。

我在一些较弱的机器上进行了测试,看起来这样的进程可以使用高达 100% 的单核使用率,这显然对性能影响很大。

我们的应用程序基于 PHP Zend-Framework(版本 1)。作为 Soap 客户端,我们使用 Zend_Soap_Client。

我很感激任何关于如何优化它的建议。先感谢您

编辑:

  1. 部分代码 - 我完全忘记了我们已经实现了用 Curl 替换 php SoapClient 请求以处理超时的修改(两种方法都会出现问题)。这是我们客户的一部分:

    try {
    
    $this->client = new SoapExt_Client($this->config->wsdl,
                  array(
                      'cache_wsdl' => WSDL_CACHE_BOTH,
                      'encoding' => $this->config->encoding,
                      'soap_version' => SOAP_1_1,
                      'classmap' => array(
                          [...]
                      ),
                      'features' => SOAP_SINGLE_ELEMENT_ARRAYS
                  )
    );
     $this->client->__setTimeout((int) $this->config->timeout);
    } catch (Exception $exc) {
    throw new My_Exception_System(My_Codes::ERROR_WS_CONNECTION_FAILED, array(__CLASS__));
    }
    

和方法调用:

$result = $this->client->$methodName($params);

所以基本上这是一个简单的肥皂电话。当脚本等待远程服务器回复时,CPU 使用率会出现峰值。

  1. 网络服务器托管在 .NET WCF 服务上。我们的客户端应用程序托管在 PHP 上(在 Apache 和 IIS 上测试)。
  2. 不,我没有使用任何调试工具。以上所有评论均基于我们的日志和性能监控。
  3. 是的,WSDL 中有几个导入。
  4. 再想一想——关于大量数据的部分可能会产生误导。我们收到的数据不会扩展 50 KB。此外,耗时最长的操作不会返回大量数据,而是网络服务器处理时间的问题。
4

0 回答 0