Ajax yoklama

11 Cevap php

Projede i şu anda üzerinde çalışıyorum, bir web sohbet uygulaması geliştirmek için ihtiyaç değil, çok karmaşık bir sohbet, çok özel bir konu hakkında konuşmak için iki kişi bağlamak için sadece bir yol, biz kimlik doğrulama her türlü gerekmez İki kullanıcılardan biri için, biz böyle ifadeler, avatarlar, ya da şeyler desteklemek zorunda değilsiniz.

Bazı proje üyeleri biz Bosh ile XMPP kullanabilirsiniz önerdi, ben bir teknenin net ile bir balık yakalamak için çalışıyor gibi, ve basit bir Ajax / MySQL web chat gibi daha basit bir yöntem önerdi, ama biz hakkında endişeli olduğunu söyledi çünkü birçok sohbetler sürekli yoklama sunucu performans bulunanlar aynı anda açın.

Herkes önce böyle bir şey yaptı? Ne tavsiye edersiniz?

11 Cevap

Ayrıca Comet içine bakmak isteyebilirsiniz.

Bu GTalk, Meebo ve birçok other chat applications tarafından kullanılır. Birkaç yıl önce ben onunla deneyler yaptığı, pek çok kütüphane veya bunu uygulamak için sunucu mimarisi hakkında bilgi yoktu, ama çok daha fazla şeyler şimdi orada gibi görünüyor.

Daha fazla teknik bilgi için cometd proje bir göz var.

Orbited - (dublaj Comet) tarayıcı sunucudan iterek mesaj işleme için çok iyi bir sunucu yoktur. Kolayca sadece memcached gibi diğer teknolojiler (Django, Rayları, PHP vb) ile entegre oluyor.

Eğer ciddi bir yükü işlemek istiyorsanız gerçekten bunu kontrol etmelisiniz. Aksi halde, basit Ajax yoklama iyi yoludur.

Hüner Birisi bir şey söylediği zaman app sunucuda CGI çağırmak için gereken sadece zaman olduğunu fark etmektir. Düzenli anketler için, yeni bir sohbet olduğunda CGI komut güncellemeleri statik bir sayfa yoklar. HEAD istekleri kullanın görülen bu son ile damgaları karşılaştırmak ve sadece tam olsun bu değişikliği yapmak. Ben bu şekilde uygulanan basit bir naif bir sohbet uygulaması var ve yükü ve bant genişliği kullanımı biz eşzamanlı kullanıcıların birkaç on için ihmal edilebilir.

Ben bir kaç ay geriye bu çok aynı şeyi yaptım ve sadece kavramları etrafında oynarken eğlendim. Aslında forever-frame tekniği yerine yoklama kullanılır.

Aşağıdaki kodu bir "parti sohbet" kurulum almak için gerekli genel kavramları içeren benim "kuyruklu yıldız" js dosyasıdır.

function Comet(key) {

  var random = key;
  var title = 'Comet';
  var connection = false;
  var iframediv = false;
  var browserIsIE = /*@cc_on!@*/false;
  var blurStatus = false;
  var tmpframe = document.createElement('iframe');
  var nl = '\r\n';

  this.initialize = function() {
    if (browserIsIE) {
      connection = new ActiveXObject("htmlfile");
      connection.open();
      connection.write("<html>");
      connection.write("<script>document.domain = '"+document.domain+"'");
      connection.write("</html>");
      connection.close();
      iframediv = connection.createElement("div");
      connection.appendChild(iframediv);
      connection.parentWindow.comet = comet;
      iframediv.innerHTML = "<iframe id='comet_iframe' src='./comet.aspx?key="+random+"'></iframe>";
    } else {
      connection = document.createElement('iframe');
      connection.setAttribute('id', 'comet_iframe');
      iframediv = document.createElement('iframe');
      iframediv.setAttribute('src', './comet.aspx?key='+random);
      connection.appendChild(iframediv);
      document.body.appendChild(connection);
    }
  }

  // this function is called from the server to keep the connection alive
  this.keepAlive = function () {
    if (!browserIsIE) {
        mozillaHack();
    }
  }

  // this function is called from the server to update the client
  this.updateClient = function (value) {
    var outputDiv = document.getElementById('output');
    outputDiv.value = value + nl + outputDiv.value;
    if (blurStatus == true) {
        document.title = value;
    }
    if (!browserIsIE) {
        mozillaHack();
    }
  }

  this.onUnload = function() {
    if (connection) {
      // this will release the iframe to prevent problems with IE when reloading the page
      connection = false;
    }
  }

  this.toggleBlurStatus = function(bool) {
    blurStatus = bool;
  }

  this.resetTitle = function() {
    document.title = title;
  }

  function mozillaHack() {
    // this hack will fix the hour glass and loading status for Mozilla browsers
    document.body.appendChild(tmpframe);
    document.body.removeChild(tmpframe);
  }
}

Herkesin bu tür bir şey için cometd kullanılır düşündüm.

I agree with John. But there was another question that was not answered.
I have done this but instead of using a database we used a flat file, it did eventually cripple the server, but it wasn't until we has ~450 active users, and if we had done it with a database it probably would have fared better.
This was done on a basic hosting account from Godaddy.

Düzenleme: Ben telefon aldığımda MEZUNLARI Godaddy az sonra eğlenerek geliyordu.

Ödeme Speeqe. open-source solution perde arkasında Bosh ve XMPP kullanan Web tabanlı sohbet odaları için onun.

Ben sadece bu yazı bulundu, o eski, ama yoklama kavram kişilere bir sürü sıkıntılar verir. Yani burada bir uygulama örneği koyacağım. Ama sana vermeden önce, size bir süre önce beni deli yapılan bir tavsiye vermek gerekir:

Yoklamak zaman, oturumları davranış ilgilenir (race conditions). Olmalıdır Basit yapmak için: Eğer bir oturum açarsanız oturum içine farklı veri yazma 2 theads önlemek için kapalı kadar, oturum dosyası kilitli. Bir kullanıcı ya da öylesine açtıysa kontrol etmek için bir oturumu gerekirse Yani, her zaman yoklama önce oturumu kapatın.

Benim demo PHP bir yoklama uygulamaya bir örnek verir. Ben bir dosya yerine bir veritabanı kullanmak, ama olmaz. Eğer yoklama butonuna tıkladığınızda, döngü girecek ve dosya değiştirilene kadar, sen yoklama kalacak. Eğer formu doldurunuz ve Release tıkladığınızda, ne yazdığınız dosya içine kaydedilecektir. Dosyanın değiştirme zamanı yoklama durdurmak böylece değişecek.

İpucu: Firebug adlı ne görmek gibi bir araç kullanın.

Şimdi benim ingilizce daha iyi langage konuşmak sağlar:

<?php

    // For this demo
    if (file_exists('poll.txt') == false) {
        file_put_contents('poll.txt', '');
    }

    if (isset($_GET['poll'])) {

        // Don't forget to change the default time limit
        set_time_limit(120);

        date_default_timezone_set('Europe/Paris');
        $time = time();

        // We loop until you click on the "release" button...
        $poll = true;
        $number_of_tries = 1;
        while ($poll)
        {
            // Here we simulate a request (last mtime of file could be a creation/update_date field on a base)
            clearstatcache();
            $mtime = filemtime('poll.txt');

            if ($mtime > $time) {
                $result = htmlentities(file_get_contents('poll.txt'));
                $poll = false;
            }

            // Of course, else your polling will kill your resources!
            $number_of_tries++;
            sleep(1);
        }

        // Outputs result
        echo "Number of tries : {$number_of_tries}<br/>{$result}";
        die();
    }

    // Here we catch the release form
    if (isset($_GET['release']))
    {
        $data = '';
        if (isset($_GET['data'])) {
            $data = $_GET['data'];
        }
        file_put_contents('poll.txt', $data);
        die();
    }

?>

<!-- click this button to begin long-polling -->
<input id="poll" type="button" value="Click me to start polling" />

<br/><br/>

Give me some text here :
<br/>
<input id="data" type="text" />
<br/>

<!-- click this button to release long-polling -->
<input id="release" type="button" value="Click me to release polling" disabled="disabled" />

<br/><br/>

Result after releasing polling :
<div id="result"></div>

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">

// Script to launch polling
$('#poll').click(function() {
    $('#poll').attr('disabled', 'disabled');
    $('#release').removeAttr('disabled');
    $.ajax({
        url: 'poll.php',
        data: {
            poll: 'yes' // sets our $_GET['poll']
        },
        success: function(data) {
            $('#result').html(data);
            $('#poll').removeAttr('disabled');
            $('#release').attr('disabled', 'disabled');
        }
    });
});

// Script to release polling
$('#release').click(function() {
    $.ajax({
        url: 'poll.php',
        data: {
            release: 'yes', // sets our $_GET['release']
            data: $('#data').val() // sets our $_GET['data']
        }
    });
});

</script>

You can try it here

Ne tavsiye edersiniz?

Bosh ile XMPP

Başkası olduğunda kendi mesaj formatı ve taşıma protokolü icat etmeye gerek yok. Eğer çalışırsanız, yavaş ama üçüncü parti kütüphane desteği veya standardizasyon parası olmadan Bosh kadar karmaşık olmak büyümek olacak.

HTTP-yoklama fikrini sevmiyorum, bazı deamon sürekli bir bağlantı vardır sohbet sayfasında bir Flash film olabilir sunucuda, Flash film daha sonra güncellemek için istemcide JavaScript işlevlerini çağırmak istiyorum yeni mesaj olarak sohbet boyunca gelir. (Eğer sohbet için bir Flash arabirimi istemiyorsan ..)

Ayrıca Comet içine bakmak isteyebilirsiniz.

Herkesin bu tür bir şey için cometd kullanılır düşündüm.

Bosh HTTP üzerinden XMPP taşımak için bir standarttır. Bu istemci veri bastırıyor için Comet içerir.