2010-04-13 62 views
4

我们目前正在考虑在一个依赖Soap Web服务的网站上调整性能。但是......我们的服务器位于比利时,我们连接的网络服务位于旧金山,因此至少可以说是一个长途连接。加快肥皂供电网站的速度

我们的网站采用PHP驱动,使用PHP内置的SoapClient类。 平均而言,对web服务的调用需要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模块可以做到这一点。 – 2010-05-04 08:58:17

回答

5

因此,根本的问题是你必须做的请求数。怎么样创建分组服务?

  • 如果你负责web服务,你可以创建专门的web服务,它可以同时执行多个操作,所以你的主应用程序可以每页只执行一个请求。
  • 如果不是,您可以将您的应用程序服务器重新安置在SF附近。
  • 如果无法重新定位所有服务器,并且无法创建新的专用Web服务,则可以在Web服务服务器附近添加一个桥。这座桥将提供专门的网络服务,并负责调用原子网络服务。例如,你会有0.7s + 5 * 0.1,而不是0.7s * 5。
+0

+1为brigde,我不负责WS本身,但是一座桥可能是一个有效的解决方案! – ChrisR 2010-05-04 11:10:49

3

PHP.INI

output_buffering = On 
output_handler = ob_gzhandler 
zlib.output_compression = Off 
+0

谢谢!似乎是一个明显的一个,并会检查,但我正在寻找一种相当实用的方法,而不是调整PHP的设置,其方式已经像你建议设置:)感谢您的建议寿! – ChrisR 2010-05-04 08:18:52

+0

实际上,zlib.output_compression优于ob_gzhandler。 – dutchmega 2010-05-04 09:16:11

+1

@ChrisRamakers - 我使用肥皂作为内部应用程序。我添加的一个功能是发送一个格式参数,它允许我在一个节点中获得json格式的数据集。我检索数据,然后让客户端设置数据。这有助于因为身体反应的长度更少,因为 ...次200已被替换为 {....} 2010-05-06 14:25:26

1

1您可以断言您的肥皂服务器使用gzip压缩http内容,以及您的网站输出。对SF的0.7s总结似乎有点长,它要么是Web服务很长的回答,要么有一个重要的无聊延迟。 如果可以的话,试试其他托管公司为您的比利时服务器,在法国有些与美国的连接性要好得多。 我经历了从一个主机移动到另一个主机的网站,巴黎和纽约之间的网络延迟几乎翻了一番!这很糟糕,我的客户和很多美国游客都对此感到不满。 将Web服务器重定位到SF的解决方案可能是一种选择,您将在服务器之间获得更好的连接,但如果访问者主要位于欧洲,请注意延迟。

2您可以使用操作码缓存机制,例如xcache或APC。它不会改变肥皂等待时间,但会改善php的执行时间。

3根据肥皂请求是否重复以及内容更新可以延长多长时间,您可以使用肥皂结果上的缓存对肥皂进行真正的改进。我建议你使用内存中的缓存系统(如xcache/memcached或其他),因为它们比文件或数据库缓存系统快得多。

从你的类时,createclient方法是不是最适合为例功能被缓存,但对于任何读操作,它只是为PErF的最佳方式:

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处理结果(如模板呈现输出和其他资源消耗操作)。这个技术成功的关键在于知道哪些部分是被缓存的,以及持续多久会令人耳目一新。

+0

我们最近实现了一个缓存机制,它取决于WS中记录的最后更新时间。客户端缓存也已到位。我并不是说我们已经把所有东西都推到了最高,但与5次以上的请求相比,收益可以忽略不计。在地理位置上重新分配服务器也可能会发挥作用,但所有访问者/用户都来自比利时和荷兰,因此将我们的服务器移至美国的网站上引入了一般延迟。 – ChrisR 2010-05-04 11:15:49

+0

好吧,似乎唯一的选择是评估WS服务器优化或更好的重新定位到比利时。 我见过的性能最好的SOA托管在同一个地方,同一个机架上,但我知道解决方案从一开始就有了这种架构 – Benoit 2010-05-04 11:40:22

3

您是否确切知道网络延迟会降低每个请求的速度?正如Benoit所说,0.7s似乎是一个漫长的一轮。我会考虑做一些基准测试 - 你可以用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_timenamelookup_timeconnect_timepretransfer_timestarttransfer_timeredirect_time元件。从这些你应该能够计算出是否是dns,请求,实际的soap服务器或者是占用时间的响应。

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

+0

往返时间确实是0.7-0.5秒......它不是一个简单的网络命令,如ping但是在服务器上也会发生一些处理,如果无法从缓存中获取,通常需要一些时间。 – ChrisR 2010-05-04 11:11:59

+0

是的 - 我不是在建议一个ping。分解0.7s - 包括对实际应用的基准测试。 – 2010-05-04 12:56:56

+2

@Chris如果ping到WS服务器的速度很快,那么距离是(很可能)_not_你的问题:) – 2010-05-07 06:08:11

-1

任何使用AJAX接口的机会..如果请求可能发生在后台,你似乎不会等待响应。

+0

他们仍然只需要加载 – rickyduck 2012-06-01 10:09:19