SORU
6 Temmuz 2009, PAZARTESİ


Nasıl facebook, gmail, gerçek zamanlı bildirim gönderiyor?

Bu konu ile ilgili bazı mesajlar okudum ve cevapları, ajax, http akışı, sunucu itme, vb kuyruklu yıldız ters.

How does incoming mail notification on Gmail works?

How is GMail Chat able to make AJAX requests without client interaction?

Eğer takip edebileceğim herhangi bir kod başvurular ise orada olduğunu bilmek çok basit bir örnek yazmak istiyorum. Birçok mesaj ya da web siteleri sadece teknoloji hakkında konuşmak. Sabit tam örnek bir kod. Ayrıca, pek çok yöntem, örneğin, Gizli kuyruklu yıldız İFrame, XMLHttpRequest uygulamak için kullanılabilir gibi görünüyor. Benim görüşüme göre, XMLHttpRequest kullanarak daha iyi bir seçimdir. Farklı yöntemlerin artıları ve eksileri hakkında ne düşünüyorsun? Hangisi Gmail kullanıyor mu?

İstemci tarafında sunucu tarafında ve bunu yapmak için ihtiyacı olduğunu biliyorum. PHP ve Javascript herhangi bir örnek kod var mı?

CEVAP
6 Temmuz 2009, PAZARTESİ


Yol Facebook bu oldukça ilginç geliyor.

Böyle bir bildirim yapmanın yaygın bir yöntemi, belirli bir zaman aralığı (belki de birkaç saniyede) sunucu üzerinde bir komut dosyası (AJAX kullanarak), eğer bir şey olup olmadığını kontrol etmek yoklamak için. Ancak, bu ağ oldukça yoğun olabilir, ve sen hiçbir şey olmamış çünkü çoğu anlamsız istekleri olun.

Yol Facebook bir anket tamamlar tamamlamaz comet yaklaşım, bir aralık üzerinde yoklama yerine, kullanıyor mu, bir tane daha verir. Ancak, sunucu üzerinde komut için her isteği çok uzun bir zaman aşımı var, ve sunucu bir şey oldu Bir zamanlar tek isteği yanıtlar. Bu kadar Firebug Facebook sekmesinde iken Konsol, komut dosyası muhtemelen dakika alma istekleri ile getirirsen oluyor görebilirsiniz. Bu yöntem, onları göndermek için ne kadar istekleri hemen her sayısında, ve kesikler var, bu çok ustaca gerçekten. Etkili bir şekilde şimdi sunucu sağlayan olay bir çerçeve var, yangın olayları.

Olaylar listesi gibi görünen ve onlar hakkında bilgi ile gerçek içeriği bu anketler döndü açısından bunun arkasında, bir JSON yanıt. Ama minified, o yüzden biraz zor okunur.

Gerçek teknoloji açısından, AJAX istek zaman aşımları, ve birçok diğer şeyler kontrol edebilirsiniz, çünkü buraya gitmek için bir yoldur. (Burada Yığın taşması klişe) jQuery AJAX yapmak için kullanmanızı tavsiye ediyorum, çapraz uyumluluk sorunları çok uzaklara götürür. PHP açısından, sadece PHP script, olay günlüğünde veritabanı tablosu anket ve sadece bir şey olduğunda istemciye geri verebilir? Sanırım, bu uygulamanın birçok yolu vardır.

Uygulama:

Sunucu Tarafı:

Kuyruklu yıldız kütüphaneler birkaç uygulamaları için PHP olarak görünüyor, ama dürüst olmak gerekirse, gerçekten çok basit, aşağıdaki yarı kod belki gibi bir şey:

while(!has_event_happened()) {
   sleep(5);
}

echo json_encode(get_events());
  • Has_event_happened fonksiyonu sadece eğer bir şey, olayları bir tablo ya da bir şey oldu diye kontrol eder, ve sonra get_events işlevi tabloda yeni satır listesi dönecekti? Sorunu bağlamında bağlıdır gerçekten.

  • Erken zaman aşımı olacak yoksa PHP max yürütme zamanını değiştirmek için unutmayın!

İstemci Tarafı:

Kuyruklu yıldız etkileşim yapmak için: jQuery eklentisi bir göz atın

Bu eklenti karmaşıklığına adil bir bit eklemek gibi görünüyor, gerçekten istemci üzerinde çok basittir, belki de (jQuery ile) şöyle bir şey demiş:

function doPoll() {
   $.get("events.php", {}, function(result) {
      $.each(result.events, function(event) { //iterate over the events
          //do something with your event
      });
      doPoll(); 
      //this effectively causes the poll to run again as
      //soon as the response comes back
   }, 'json'); 
}

$(document).ready(function() {
    $.ajaxSetup({
       timeout: 1000*60//set a global AJAX timeout of a minute
    });
    doPoll(); // do the first poll
});

Her şey mevcut mimari nasıl bir araya getirildiği çok bağlıdır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B3ASTTY™

    B3ASTTY™

    27 Mayıs 2013
  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011