PHP Curl kütüphanesi ile Kalıcı / keepalive HTTP?

5 Cevap php

Ben HTTP üzerinden, bir SOLR dizine belgeleri eklemek için basit bir PHP kütüphanesi kullanarak ediyorum.

Katılan 3 sunucuları şu vardır:

  1. Indeksleme işini çalışan PHP kutusu
  2. Dizine verileri tutan bir veritabanı kutusu
  3. Solr kutusu.

80 belgeler / sn (1 milyon dokümanlar üzerinden), ben PHP ve Solr kutuları (2000/sec üzerine ağ arayüzleri üzerinde alışılmadık ölçüde yüksek bir kesme hızını fark ediyorum; dahası, grafikler hemen hemen aynıdır - olduğunda kesme PHP kutu sivri oranı, aynı zamanda) Solr kutusunda sivri, ama çok daha az veritabanı kutusunu (300/sec). Ben açın ve veritabanı sunucusu tek bir bağlantıyı yeniden çünkü bu sadece hayal, ama her Solr isteği şu Solr istemci kütüphanesi yazılı şekilde sayesinde, cURL üzerinden yeni bir HTTP bağlantısı açıyor.

Yani, benim soru:

  1. CURL bir canlı tutma oturumu açmak için yapılabilir mi?
  2. Ne bir bağlantıyı yeniden sürer? - Bu cURL tanıtıcısı kaynak yeniden kadar basittir?
  3. Ben herhangi bir özel cURL seçeneklerini ayarlamak gerekiyor? (Örn., HTTP 1.1 zorlamak?)
  4. CURL keepalive bağlantıları ile herhangi bir FRİKİKLERİNDEN var mı? Bu komut dosyası, bir seferde saatlerce çalışır; Ben tek bir bağlantı kullanmak mümkün olacak, ya da ben periyodik olarak yeniden gerekir?

5 Cevap

cURL PHP belgeleri (curl_setopt) diyor ki:

CURLOPT_FORBID_REUSE - TRUE to force the connection to explicitly close when it has finished processing, and not be pooled for reuse.

Yani:

  1. Evet, aslında sürece, varsayılan olarak bağlantıları yeniden kullanmak gerekir
  2. Eğer cURL tanıtıcısı yeniden kullanmak.
  3. Varsayılan olarak, cURL kendisi tarafından kalıcı bağlantıları kolları; Eğer bazı özel başlıklarını gerektiğinde, CURLOPT_HTTPHEADER kontrol
  4. sunucu canlı tutma zaman aşımı (varsayılan Apache yüklemek ile, ilk hangisi, 15 saniye veya 100 istekleri) gönderebilir - ama o olur cURL sadece başka bir bağlantı açılacaktır.

Curl varsayılan canlı tutma başlığı gönderir, fakat:

  1. herhangi bir parametre olmadan curl_init() ile bir bağlam yaratmak.
  2. hayatta bir kapsamda bağlamı depolamak (yerel var değil)
  3. bağlamına url geçmek için CURLOPT_URL seçeneğini kullanın
  4. kullanarak talebini yerine curl_exec()
  5. curl_close() ile bağlantısını kapatın yok

çok basit bir örnek:

function get($url) {
    global $context;
    curl_setopt($context, CURLOPT_URL, $url);
    return curl_exec($context);
}

$context = curl_init();
//multiple calls to get() here
curl_close($context);
  1. Sunucuda canlı tutma erişen etkin olmalıdır ve maksimum canlı tutma istekleri makul olmalıdır. Apache'nin durumunda, apache docs bakın.

  2. Sen aynı cURL bağlamı yeniden kullanarak gerekir.

  3. CURL bağlamı yapılandırırken, canlı tutma zaman aşımı ile başlığında etkinleştirin:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive',
        'Keep-Alive: 300'
    ));
    

Eğer isteğin yanıtı umurumda değil ise, uyumsuz bunları yapabilirsiniz, ancak SOLR endeksi yüklenme riski vardır. Gerçi şüpheliyim, SOLR lanet oldukça hızlıdır.

http://stackoverflow.com/questions/124462/asynchronous-php-calls

Ben kıvırmak canlı tutma yapılabilir sanmıyorum, ama yanlış olabilir. Canlı tutma kullanırsanız, herhangi bir durumda, istemci sunucu muhtemelen saat, hatta dakika boyunca tek bir bağlantı tutmak için izin vermez, çünkü özellikle bir kopukluk halinde periyodik olarak yeniden muktedir gerekir.