加快肥皂动力网站的速度

时间:2010-04-13 13:58:52

标签: php performance soap soap-client

我们目前正在寻求在一个严重依赖Soap网络服务的网站上进行一些性能调整。但是......我们的服务器位于比利时,我们连接的网络服务位于旧金山,所以这是一个长途连接至少可以说。

我们的网站是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;
}

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off

答案 2 :(得分: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);

$info将返回一个数组,其中包含total_timenamelookup_timeconnect_timepretransfer_timestarttransfer_timeredirect_time的元素。从这些你应该能够弄清楚它是dns,请求,实际的肥皂服务器还是占用时间的响应。

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

答案 3 :(得分:2)

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

的提示

答案 4 :(得分:1)

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

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

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

在你的类中,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处理结果(比如模板渲染输出和其他资源消耗操作)。使用这种技术取得成功的关键是要确切知道哪部分是缓存的,以及它将保持多久才能保持清爽。

答案 5 :(得分:-1)

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