Bir sabun çalışan web sitesi hızlandırmak

6 Cevap php

Biz şu anda bir Soap webcoder dayanır bir web sitesinde bazı performans ayarını yaparken içine arıyoruz. Ama ... sunucularımız Belçika'da bulunan ve biz bağlanmak webservice az söylemek için uzun bir mesafe bağlantı yani San Francisco bulmak olduğunu vardır.

Our website is PHP powered, using PHP's built in SoapClient class. On average a call to the webservice takes 0.7 seconds and we are doing about 3-5 requests per page. All possible request/response caching is already implemented so we are now looking at other ways to improved the connection speed.

Bu tek Requestes üzerinde hızını artırmak için başka yollar / yöntemler olduğunu ben şimdi arıyorum ne SoapClient başlatır kodudur. Herkes bir fikir veya önerileriniz var?

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 Cevap

Yani, kök sorun yapmanız gereken istek sayısıdır. Ne gruplandırılmış hizmetleri oluşturma hakkında?

  • Eğer webservices sorumlu iseniz, ana app sadece sayfa başına bir istek yapmak, böylece aynı anda birden fazla işlem yapmak özel webservices oluşturabilir.
  • Eğer değilse SF yakın app sunucusu yerlerini değiştirebilirsiniz.
  • Tüm sunucu taşındıktan mümkün değildir ve yeni uzman webservices oluşturmak mümkün değil, size webservices sunucunun yakınında bulunan bir köprü, ekleyebilirsiniz. Bu köprü özel webservices sağlamak ve atomik webservices çağrı sorumlu olacaktır. Bunun yerine * 5 0.7s arasında örneğin 0.7s + 5 * 0,1 olurdu.

PHP.INI

output_buffering = On
output_handler = ob_gzhandler
zlib.output_compression = Off

Eğer ağ gecikme her isteği yavaşlıyor emin için biliyor musunuz? Benoit dediği gibi 0.7s, bir uzun yuvarlak bir zaman gibi görünüyor. Bazı kıyaslama yapıyor bakmak istiyorum - Ben bu sabun müşteri ile çalışmak nasıl olurdu emin değilim rağmen, kıvrılma ile yapabilirsiniz.

Gibi bir şey:

$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 için elementler dahil olmak üzere bir dizi döndürür, {[(5 )]} ve redirect_time. Bunlardan Eğer dns, istek, gerçek sabun sunucusu veya zaman kadar alıyor tepki olsun çalışmak gerekir.

Sadece aklıma geldi Bir şey açık, bir etki alanı veya bir IP üzerinden SOAP sunucuyu talebinde mi? Eğer bir etki alanı kullanıyorsanız (birkaç aşamada önbelleğe olacak olsa da), kendi dns anlamlı şeyler yavaşlatan olabilir. Ve (DNS Zone) etki TTL - yerel dns zaman (emin değil sabun istemci veya php.ini içinde) kontrol edin. Lütfen sanfran sunucusu için bir statik IP kurmak ve bunu zaten bu şekilde değilse başvuru.

Önbelleğe alma ve HTTP sıkıştırmak kullanarak Sunucular (istemci değil!) HTTP yanıt optimize. Yahoo da ipuçlarına bir göz atın http://developer.yahoo.com/performance/rules.html

1 You can assert your soap server use gzip compression for http content, as well as your site output does. A 0,7s roundup to SF seems a bit long, it's either webservice is long to answer, either there is an important natwork latency. If you can, give a try to other hosting companies for your belgium server, in France some got a far better connectivity to the US than others. I experienced to move a website from one host o another and network latency between Paris and New york has almost doubled ! it's uge and my client with a lot of US visitors was unhappy with it. The solution of relocating web server to SF can be an option, you'll get a far better connectivity between servers, but be careful of latency if your visitors are mainly located in Europe.

2. Bu tür xcache veya APC gibi bir opcode önbellek mecanism kullanabilirsiniz. Bu sabun gecikmeyi değiştirmek değil wil, ama php yürütme süresini artıracaktır.

3 sabun isteği tekrarlayan iseniz, ve bağlı olarak bir içerik güncelleme uzatılabilir olabilir olabilir ne kadar, sabun sonuçları önbelleğini kullanarak onu gerçek bir iyileşme verebilir. Ben ay dosya veya DB önbellek sistemi çok daha hızlı çünkü sen-bellek önbellek sistemi (gibi xcache / memcached veya diğer) kullanmanızı öneririm.

Sınıfından, createclient yöntemi önbelleğe alınacak en iyi uyarlanmış exemple işlevselliği değil, ancak herhangi bir okuma işlemi için perf için sadece en iyi yolu:

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);
}

Örnek XCache uzantısı olduğunu, ancak bir çok benzer şekilde diğer sistemlerini kullanabilirsiniz

4 (işlemleri consumming şablon render çıkış ve diğer ressource gibi) php işlem sonuçlarını önbelleğe benzer mecanism kullanabileceğiniz ileri gitmek için. Bu tekniği ile başarının anahtarı tam wich bölümü önbelleğe ve withous ferahlatıcı kalacak ne kadar süre için olduğunu bilmek önemlidir.

Istekleri arka planda oluyor olabilir eğer .. AJAX arayüzü kullanarak herhangi bir şans, size yanıt bekliyor bırakılmaması gibi görünmüyor.