加速一个使用SOAP技术的网站

5
我们目前正在寻求对一个严重依赖Soap webservice的网站进行性能调优。但是,我们的服务器位于比利时,而我们连接的webservice位于旧金山,因此可以说这是一次长途连接。
我们的网站由PHP驱动,使用PHP内置的SoapClient类。平均而言,对webservice的调用需要0.7秒,并且我们每页要进行3-5个请求。所有可能的请求/响应缓存已经实现,因此我们现在正在寻找其他方法来提高连接速度。
这是实例化SoapClient的代码,我现在正在寻找其他方法/方法来提高单个请求的速度。有人有想法或建议吗?
private function _createClient()
{
    try {

        $wsdl = sprintf($this->config->wsUrl.'?wsdl', $this->wsdl);
        $client = new SoapClient($wsdl, array(
            'soap_version'       => SOAP_1_1,
            'encoding'           => 'utf-8',
            'connection_timeout' => 5,
            'cache_wsdl'         => 1,
            'trace'              => 1,
            'features'           => SOAP_SINGLE_ELEMENT_ARRAYS
        ));

        $header_tags = array('username' => new SOAPVar($this->config->wsUsername, XSD_STRING, null, null, null, $this->ns),
                             'password' => new SOAPVar(md5($this->config->wsPassword), XSD_STRING, null, null, null, $this->ns));
        $header_body = new SOAPVar($header_tags, SOAP_ENC_OBJECT);
        $header = new SOAPHeader($this->ns, 'AuthHeaderElement', $header_body);

        $client->__setSoapHeaders($header);

    } catch (SoapFault $e){
        controller('Error')->error($id.': Webservice connection error '.$e->getCode());
        exit;
    }

    $this->client = $client;
    return $this->client;
}

5
如果你不能将服务器迁移到旧金山,你可以尝试将其迁移到比利时。我认为有一个Python模块可以实现这一点。 - o0'.
6个回答

5
因此,根本问题是请求的数量。那么,创建分组服务如何?
  • 如果您负责Web服务,则可以创建专门的Web服务,同时执行多个操作,以便您的主应用程序每页只需执行一次请求。
  • 如果不行,您可以将应用服务器迁移到旧金山附近。
  • 如果无法重新定位所有服务器并且无法创建新的专业Web服务,则可以添加一个位于Web服务服务器附近的桥接器。该桥接器将提供专业Web服务,并负责调用原子Web服务。例如,代替0.7秒*5,你将拥有0.7秒+5*0.1。

+1 对于桥接,我不负责WS本身,但是桥接可能是一个有效的解决方案! - ChrisR

3

您确定网络延迟是导致每个请求变慢的原因吗?像Benoit所说,0.7秒的往返时间似乎太长了。建议做一些基准测试 - 您可以使用curl进行测试,尽管我不确定这与您的soap客户端如何协作。

大概就是这样:

$ch = curl_init('http://path/to/sanfrancisco/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
$info = curl_getinfo($ch);

$info 将返回一个数组,其中包括 total_time, namelookup_time, connect_time, pretransfer_time, starttransfer_timeredirect_time 元素。通过这些元素,您应该能够推断出是DNS解析、请求、实际的SOAP服务器还是响应占用了时间。

一个显而易见的事情刚刚发生在我身上,你是否通过域名或IP请求SOAP服务器?如果您正在使用域名,您的DNS可能会显著减慢速度(尽管它将被缓存在多个阶段)。检查您的本地DNS时间(在SOAP客户端或php.ini中 - 不确定)以及您的域的TTL(在DNS区域中)。如果尚未设置,请为您的 SanFran 服务器设置静态 IP 并引用它。


往返时间确实为0.7-0.5秒...它不像ping那样是一个简单的网络命令,而且服务器上还会进行一些处理,如果无法从缓存中获取,则通常需要一些时间。 - ChrisR
是的 - 我并不建议进行 ping 测试。需要分解这个 0.7 秒 - 包括对实际应用程序进行基准测试。 - Adam Hopkinson
2
@Chris,如果向WS服务器发出ping的响应速度很快,则距离(很可能)_不是_您的问题 :) - Rune FS

3

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off

谢谢!这似乎是一个显而易见的方法,我会检查一下,但我正在寻找一个更实用的方法,而不是调整 PHP 设置,顺便说一句,这些设置已经像你建议的那样设置了 :) 虽然感谢你的建议! - ChrisR
实际上,zlib.output_compression 优于 ob_gzhandler。 - dutchmega
1
@ChrisRamakers - 我在内部应用程序中使用SOAP。我添加的一个功能是发送格式参数,它允许我在一个节点中获取JSON格式的数据集。我检索数据,然后允许客户端设置数据。这有助于减少响应体长度,因为<tag>...</tag>乘以200已被替换为<json>{....}</json>。 - Brant Messenger

2

1

1 您可以断言您的SOAP服务器使用gzip压缩进行HTTP内容传输,以及您的站点输出。0.7秒的SF轮廓似乎有点长,要么是Web服务长时间未响应,要么是存在重要的网络延迟。如果可以的话,请尝试其他托管公司为您的比利时服务器提供服务,在法国,一些公司与美国的连接性要好得多。我曾经将一个网站从一个主机移动到另一个主机,巴黎和纽约之间的网络延迟几乎翻了一番!这是巨大的,我的客户有很多美国访问者对此感到不满。将Web服务器重新定位到SF的解决方案可能是一个选项,您将获得更好的服务器连接性,但是如果您的访问者主要位于欧洲,请注意延迟。

2 您可以使用opcode缓存机制,例如xcache或APC。它不会改变SOAP延迟,但会提高PHP执行时间。

3 根据SOAP请求是否重复以及内容更新需要延长多长时间,您可以使用SOAP结果缓存来实现真正的改进。我建议您使用内存缓存系统(如xcache/memcached或其他),因为它们比文件或DB缓存系统快得多。

从您的类中来看,createclient方法并不是最适合被缓存的示例功能,但对于任何读取操作来说,它是最佳的性能方式:

private function _createClient()
{
  $xcache_key = 'clientcache'
  if (!xcache_isset($key)) {
      $ttl = 3600; //one hour cache lifetime
      $client = $this->_getClient(); ///private method embedding your soap request          
      xcache_set($xcache_key, $client, $ttl);
      return $client;
   }
   //return result form mem cache
   return xcache_get($xcache_key);
}

这个例子是关于xcache扩展的,但你可以用类似的方式使用其他系统

4 如果想进一步,你可以使用类似的机制来缓存你的php处理结果(如模板渲染输出和其他资源消耗操作)。成功运用这种技术的关键是要知道哪些部分被缓存以及它们在不刷新的情况下会保留多久。


我们最近实施了一个缓存机制,该机制依赖于WS中记录的最后更新时间。客户端缓存也已经就位。我不是说我们已经将所有东西推到极致,但与跨越0.5秒的超过5个请求相比,收益微不足道。地理上重新分配服务器可能也有用,但我们所有的访问者/用户都来自比利时和荷兰,因此将我们的服务器移动到美国会在整个网站上引入一般性延迟。 - ChrisR
好的,看起来评估的唯一选择是WS服务器优化或更好地迁移到比利时。我见过的表现最佳的SOA都托管在同一地点、同一机架上,但我承认这个解决方案从一开始就有这种架构。 - Benoit

-1

有没有可能使用 AJAX 接口... 如果请求可以在后台进行,你就不会等待响应了。


它们仍需要同样长的时间来加载。 - rickyduck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接