PHP ile bir sohbet odası komut dosyası nasıl yapılır?

9 Cevap php

Birçok ziyaretçi http://site.com/chat.php bağlanmak

Her yazmak ve chat.php bir metin mesajı göndermek ve herkesin tarayıcısında anında görüntüler olabilir (http://site.com/chat.php)

Ben bir veritabanı kullanmak zorunda mı? Yani, oturumları böyle bir sohbet odası için yeterli AJAX veya PHP tampon yetenekleri nedir?

Nasıl farklı kullanıcıların oturumları birbirinden verileri paylaşabilir?

Herhangi bir fikir ya da anlayışlar takdir edilecektir, teşekkürler!

Edit: link için teşekkürler. Ama ne istediğiniz bir istemci tarayıcısına veri itmek için bir yoldur. Sürekli istemci tarayıcısını (AJAX veya değil) tek yolu yenileniyor? Ayrıca burada sorun, örneğin, ne kadar farklı kullanıcıları, 2, 1, hisse sohbet metinler üzerinde 1? Onları nasıl saklamak? Ve nasıl 2 istemcileri arasındaki metinler senkronize edebilirim? Bir veritabanı tercihen kullanarak değil.

Düzenleme 2: Aslında YShout Peter D tarafından bahsedilen oldukça iyi bu işi yapar. Bu tarayıcıyı yenileyin tutmak için görünmüyor. Ama mevcut kullanıcının penceresine yeni mesajlar iter nasıl anlamıyorum.

9 Cevap

Bir sohbet uygulaması oluşturmak için (kabaca) 3 seçenek vardır:

sockets

arkaplanı için önyüz ve bir soket yetenekli bir programlama dili için flash / java ve prizler kullanın. Onlar multithreading ve MİT-yetenekli çünkü arkaplanı için, ben, java veya python tavsiye ederim. (ama php gerçekten verimli çoklu yapamaz ve genellikle gerçekten bunun için uygun değildir) PHP ile bunu yapmak mümkün. Eğer yüksek performans gerekiyorsa, bu bir seçenek olduğunu ve muhtemelen aradığınız değil ne.

use ajax and pull

yeni bir şey oldu, bu durumda tüm istemcileri (örneğin hiç 2 saniye) sürekli yoklama vardır. Eğer sadece bu aralıklarda tepkiler olsun çünkü garip hissediyor. ayrıca, bu sunucu ve bant genişliği üzerinde oldukça büyük bir yük koyar. Eğer tarayıcı sürekli yeniler, çünkü bir uygulama bu tekniği kullanır biliyorum. Bu suboptimal çözümdür.

use ajax and push

Bu çok parçalı-yanıtları ile çalışır ve uzun backend (php-) komut dosyalarını çalıştıran oldu. değil en iyi çözüm, ama çekme daha iyi ve çalışır ve birkaç tanınmış sohbet apps kullanılan çoğu zaman. Bu teknik, bazen bir COMET.

benim tavsiye: Eğer üretim kullanımı için bir sohbet uygulaması gerekirse, varolan birini yükleyin. programlama uygulamalar sohbet that kolay değildir.

sadece bunu öğrenmek istiyorsanız, ajax ve itme kullanarak bir program deneyin, sonra basit bir ajax / çekme uygulaması ile başlar.

ve evet, büyük olasılıkla i başarıyla eğlenmek için metin dosyaları ile çalışan çok basit bir ajax / çekme çözüm uygulanan sert bir veritabanı gerekir (ama kesinlikle üretimde kullanmak olmaz!).

o (benim bilgi için, ama ben eminim) (sadece tek başına javascript frontend) ile bir sunucu tarafı arkaplanı olmadan bir sohbet uygulaması oluşturmak mümkün değil!

UPDATE

Eğer iterek verilerin nasıl yapıldığını bilmek istiyorsanız, burada kaynak bakmak: http://wehrlos.strain.at/httpreq/client.html. uyumsuz çok parçalı ne istiyorsun :)

function asSendSyncMulti() {
    var httpReq = new XMLHttpRequest();

    showMessage( 'Sending Sync Multipart ' + (++this.reqCount)  );

    // Sync - wait until data arrives
    httpReq.multipart   = true;		
    httpReq.open( 'GET', 'server.php?multipart=true&c=' + (this.reqCount), false );
    httpReq.onload = showReq;
    httpReq.send( null );
}

function showReq( event ) {
    if ( event.target.readyState == 4 ) {
        showMessage( 'Data arrives: ' + event.target.responseText );
    }
    else {
        alert( 'an error occured: ' + event.target.readyState );
    }

}

showReq denir every time veri (Ben burada jquery veya prototip kullanarak değilim, bu yüzden kod biraz obez - bu :) gerçekten eski) sadece bir kez düzenli ajax-istekleri gibi, geldi.

Burada sunucu tarafı kısmı:

<?php

    $c = $_GET[ 'c' ];

    header('Content-type: multipart/x-mixed-replace;boundary="rn9012"');

    sleep( 1 );

    print "--rn9012\n";
    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: First Part of Request " . $c . "\n";
    print "--rn9012\n";
    flush();

    sleep( 3 );

    print "Content-type: application/xml\n\n";
    print "\n";
    print "Multipart: Second Part of Request " . $c . "\n";
    print "--rn9012--\n";

?>

update2

veritabanı hakkında: Eğer backend mod_php / cgi gibi bir şey-mimari paylaştı var ise, definitley ihtiyaç veritabanları veya TextFiles gibi dış depolama some tür. ama: Kendi http sunucusu yazarak hafızasına güveniyor olabilir (php ile mümkündür, ama ciddi bir çalışma için bunu tavsiye etmem). O gerçekten çok karmaşık değil, ama muhtemelen biraz Sorunuzun kapsamı dışında ^ ^

update3

ben bir hata yaptım! i gerçekten böyle bir şey yaptım uzun zaman oldu, çünkü ortalık karışmış. Burada düzeltmeler şunlardır:

  1. Çok parçalı tepkiler sadece mozilla tarayıcıları ile çalışmak ve bu nedenle sınırlı kullanımı vardır. COMET çok parçalı-tepki anlamına gelmez.

  2. Geleneksel singlepart yanıtı, ancak eldeki veriler kalmayıncaya kadar (sonsuz döngü ve uyku ile) almıştır: COMET demektir. böylece tarayıcı tepki layık hiçbir şey olmuyor bile, (en kötü durumda) her eylem için 1 istek / yanıt değil, bir istek, her x saniye vardır.

Bir DB olmadan çalışmak için bu isteyen ve istemci olmadan (ler) yoklama güncellemeleri için sunucu doğurabilirdi.

Teorik olarak sunucu üzerinde bir metin dosyasına sohbetleri "log", saklama ve kullanıcı chat.php sayfada bir GET isteği yapar böylece sayfayı değiştirerek bunu yapabilirsiniz, ancak PHP sayfası aslında geri gönderme bitmiyor kullanıcıya. (Örneğin Tepki tamamlar asla)

Sen mesajları geldiğinde bağlantı oluyor ama teoride bu işe tutmak için bazı "no op" verilerinizi geri göndermek gerekir.

Sorun Yukarıdaki hala bir sürü iş başarmak için, olduğunu. Bu tür - (örneğin daha fazla iş bir iframe sen yuva sohbet günlüğü sürece) ... ve kullanıcıların tarayıcı bütün zaman dönerdi ... Yeni yorum göndermek için geri sunucuya AJAX Mesajları yapmak gerekir Kurulum sadece yönetmek çok zor olurdu.

Ben başka bir yerden serbest sohbet komut dosyası kapma öneririm (örneğin http://tinychat.com/) veya (eğlence / deneyimi için) daha sonra devam kendi rulo, ama bir sayfa bir DB ile başlar ve inşa etmek istiyorsanız, o olacak itin ve sunucusundan mesajları çekin.

Sonunda AJAX istekleri ile sunucu "çekiç" ... yapmayacağım konusunda endişeleriniz varsa. Sadece performans sorunları vardır bulursanız, herhangi bir aktivite olduğunda istekleri yüzlerce sohbet sel değil böylece optimize etmek nasıl bir soru ile StackOverflow dönmek, sonra sohbet oluşturmak.

HTTP itme kolay için yapılmış olmasa da, siz PHP komut sonlandırmak ve JavaScript sonuç dikkatle izledim asla sahip bir itme bağlantı taklit edebilir.

Esasen bir akışı okuyucu simüle ediyoruz.

Eğer onlar odaya girdi önce meydana sohbet geçmişini yüklemek yeni kullanıcı isterseniz, DB veya diğer depolama gereklidir. Eğer öğrenme için bir sohbet oluşturmak için çalıştığınız sürece, rahatsız ücretsiz kullanmak için orada çok var.

http://tinychat.com başka basit bir sohbet sitesidir.

AJAX çalışıyor. Benim sitelerden biri için basit bir sayfa oluşturduk. Ama bu sohbet gibi sık düşünürdüm gibi alışmak değil bulabilirsiniz.

Veri paylaşımı biraz daha karmaşık alır ve bir IRC sunucu barındırma ve kullanıcıların veri değişimi yeteneğine sahip IRC istemcileri kullanmak için izin vererek gerçekleştirmek daha kolay olacaktır. Hiçbir şey bir kullanıcı siteye upload zorunda sizi durdurma olsa, sonra diğerleri indir. Kullanıcıların birbirleri ile herhangi bir şekilde bağlı değildir, çünkü kişiye kişi, bir web arayüzü kullanarak zor olacaktır.

ve herkesin tarayıcınızda anında görüntüler

Php / JS ile sunucudan müşterilerine veri itmek olamaz. Yani müşteri sunucudan veri sormak gerekir. Ve bu scunliffe görevinden açıklanan da budur.

There is also YShout but it's "donation ware" http://yurivish.com/yshout/

Güvenli sohbet programı oluşturma basit gibi görünebilir ama aslında oldukça bir meydan okuma olabilir. Bir kullanıcıların tarayıcı verilerini bastırıyor kolay değildir.

Ne google ilk hit hakkında? http://www.phpfreechat.net/

EDIT: anasayfa daha fazla veya daha az bir veritabanı olmadan mümkün olup olmadığı hakkında soru cevaplar, çünkü ben bu linki yayınlanmıştır (cevap: Evet, ama bu durumda filsystem veri depolamak gerekiyor). Ayrıca, proje öylesine gitmek ve bunu uygulamaya nasıl bir göz var, açık kaynak.

Sen PubNub gibi bir hizmeti kullanarak HTML ve JavaScript ile tamamen yapabilirsiniz. Eğer son x sohbet mesajları doldurmak için history api gibi bir şey kullanabilirsiniz gibi bir veritabanına ihtiyaç olmazdı.

İşte PubNub ile bir sohbet uygulaması bina hızlı bir öğretici olduğunu.

Real-time Chat Apps in 10 Lines of Code

enter görüntü açıklaması here

Enter Chat and press enter
<div><input id=input placeholder=you-chat-here /></div>

Chat Output
<div id=box></div>

<script src=http://cdn.pubnub.com/pubnub.min.js></script>
<script>(function(){
var box = PUBNUB.$('box'), input = PUBNUB.$('input'), channel = 'chat';
PUBNUB.subscribe({
    channel  : channel,
    callback : function(text) { box.innerHTML = (''+text).replace( /[<>]/g, '' ) + '<br>' + box.innerHTML }
});
PUBNUB.bind( 'keyup', input, function(e) {
    (e.keyCode || e.charCode) === 13 && PUBNUB.publish({
        channel : channel, message : input.value, x : (input.value='')
    })
} )
})()</script>

iyi ses / video chat script Gyaro http://www.gyaro.com olduğunu