5

我们目前正在考虑对一个严重依赖 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;
}
4

6 回答 6

5

因此,根本问题是您必须执行的请求数量。如何创建分组服务?

  • 如果您负责 web 服务,您可以创建专门的 web 服务,同时执行多项操作,这样您的主应用程序每页只能执行一个请求。
  • 如果没有,您可以将您的应用服务器重新定位在 SF 附近。
  • 如果无法重新定位所有服务器并且您无法创建新的专用 Web 服务,您可以添加一个位于 Web 服务服务器附近的网桥。该桥将提供专门的 Web 服务并负责调用原子 Web 服务。例如,您将拥有 0.7s + 5 * 0.1 而不是 0.7s * 5。
于 2010-05-04T08:50:47.467 回答
3

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off
于 2010-04-13T14:54:48.300 回答
3

您确定是网络延迟减慢了每个请求吗?正如 Benoit 所说,0.7s 似乎是一个很长的循环时间。我会考虑做一些基准测试——你可以用 curl 来做到这一点,虽然我不确定这将如何与你的肥皂客户端一起工作。

就像是:

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

$infototal_time将返回一个包含、namelookup_timeconnect_timepretransfer_time和的元素starttransfer_time的数组redirect_time。从这些您应该能够确定是 dns、请求、实际的肥皂服务器还是占用时间的响应。

我刚刚想到的一件显而易见的事情是,您是通过域还是 IP 请求 SOAP 服务器?如果您使用的是域,您的 dns 可能会显着减慢速度(尽管它会在几个阶段被缓存)。检查您的本地 dns 时间(在您的肥皂客户端或 php.ini - 不确定)和您的域的 TTL(在您的 DNS 区域中)。为您的 SanFran 服务器设置一个静态 IP 并以这种方式引用它(如果还没有的话)。

于 2010-05-04T10:01:34.097 回答
2

通过使用缓存和 HTTP 压缩来优化服务器(而不是客户端!)HTTP 响应。在 yahoo http://developer.yahoo.com/performance/rules.html查看提示

于 2010-05-05T10:49:54.443 回答
1

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

2 您可以使用操作码缓存机制,例如 xcache 或 APC。它不会改变soap延迟,但会提高php执行时间。

3 根据soap请求是否重复,以及内容更新可以延长多长时间,您可以使用soap结果缓存对其进行真正的改进。我建议您使用内存缓存系统(如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 处理结果(如模板渲染输出和其他资源消耗操作)。这种技术成功的关键是确切地知道缓存的部分以及它将保持多长时间而不刷新。

于 2010-05-04T09:48:50.963 回答
-1

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

于 2010-05-07T05:36:28.693 回答