我几个月来一直在努力解决这个问题,所以我决定寻求帮助。在我们当前的项目中,我们使用多个Web服务与外部服务器进行通信。其中一个处理大量数据,肥皂调用需要很长时间。一些方法调用最多需要5-10秒。
我们可以处理这样的时间,问题出在其他地方。我们使用非常强大的机器来托管我们的应用程序(专用,6个氙处理器,16 GB RAM内存)。当我们调用外部WS并且服务器侦听响应时,CPU使用率峰值很大。
我已经在一些较弱的机器上测试了它,看起来这样的进程可以使用高达100%的单核使用率,这显然会大大影响性能。
我们的应用程序基于PHP Zend-Framework(版本1)。作为Soap客户端,我们使用Zend_Soap_Client。
我很感激如何优化这一点。 提前谢谢
编辑:
部分代码 - 我完全忘了我们已经实现了修改,用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);
基本上这是一个简单的Soap Call。当脚本等待远程服务器提供服务时,会出现CPU使用率峰值。