2009-03-02 14 views
4

php, mysql ve jquery kullanarak bir sohbet komut dosyası hazırladım. Sunucudan veri almak için json'u kullanır. Sunucudan yeni mesajlar almak için son olarak getirilen mesaj kimliğine sahip sunucuya sabit aralıklı istekler yapar. Ancak, birden fazla kullanıcı sohbet ederse, sunucuya bir saat içinde binlerce ve istekleri yerine getirilecek ve barındırma yapan kişiler bunu kesin olarak engelleyecektir.jQuery, PHP ve MySQL kullanarak nasıl sohbet yapılır?

Th gmail sohbet bence soket kullanır. Çünkü kesin aralıklı istekler göndermez. Herhangi biriniz lütfen bu sorunu çözmek için bana biraz örnek kod veya biraz yön verin.

Lütfen umutsuzca yardıma ihtiyacım var.

Şimdiden çok teşekkürler. Herkese saygı ve saygılarımla.

cevap

7

Kullandığınız ana bilgisayar "çok fazla istekte bulunuyorsa" engelliyorsa, kodunuz hakkında endişelenmeden önce farklı bir ana bilgisayar edinmeyi veya barındırma paketinizi yükseltmeyi düşünebilirsiniz. O iframe'in JavaScript kalıcı bağlantısı üzerinden bir HTTP GET isteği yapmak zorunda biz başka bir kullanıcıdan metni almak için seçtim yöntem yüklemeli her Facebook sayfasında bir iframe içerir nasıl Facebook implements their chat:

göz atın ve Bu, numaralı sunucuya geri dönmez, sunucunun istemci için verileri vardır. kesintiye uğradığında veya zaman aşımına uğradığında istek yeniden oluşturulur. Bu herhangi bir yöntemle değildir: Bu, Comet'in bir varyasyonu, özellikle XHR uzun yoklama ve/veya BOSH'dir.

+0

Yardımlarınız için çok teşekkürler. Gerçekten takdir ediyorum. – Kunal

+0

Hatta, etki alanı ajax istekleri yapmak için iframe kullanıyorum. Sohbet komutum diğer web sitelerine yüklenecek ancak mesajlar ve kullanıcı listesi benim sunucumda olacak. Kalıcı bağlantı hakkında daha fazla bilgi edinmeniz gerekiyorsa, biraz boş zamanınız varsa bazı ipuçlarını takdir ediyorum. Teşekkürler yahoo! – Kunal

0

Neden host bunu bloke eder? Bir sayfa için standart bir http isteği oluşturuyorsanız, sunucunuz buna izin vermiyorsa, geçiş yapma zamanı gelmiştir.

Yuvalar, javascript aracılığıyla bir yuvaya bağlanabilme konusunda herhangi bir yerel yetenek değildir; ancak JSocket'in bir yuvayı, sunucunuza bağlı bir gömülü flaştan geçirmenizi sağlayan bir lib olduğunu düşünmeme rağmen. Bunu yapan bir jQuery eklentisi aramamış olabilir, biri olabilir.

Sunucu tarafı kodunuz da büyük ölçüde değişecektir (kalıcı vs yoklama çok farklıdır), böylece işinizin sizin için kesilmesini sağlayabilirsiniz.

Yaptığınız şeyi yapmanı ve işlemciyi kaldıramıyorsa yükseltmenizi öneririm. Bir seferde çok sayıda kullanıcı olacak mı? Bir önbellekleme sistemi, böylece her istekte db'ye çarpmamanız, meşgul olsaydı büyük olasılıkla işleri hızlandırabilir.

+0

İstemciden json verilerini çöpe attığım sayfadan önbellek ekleyebilir miyim? Lütfen tavsiye. – Kunal

+0

Elbette. Bir saniyede bir güncelleme için ortalama 300 isteğiniz olduğunu varsayalım, bu genellikle saniyede 300 db sorguya dönüştürülecektir. Bunun yerine, en son json verilerini tutan basit bir dosyaya sahip olabilirsiniz, her istekte dosya son modunu kontrol et, eğer bir saniyeden büyükse, db'nizi vurup ... (limit) – savageguy

+0

dosyayı en son veriyle güncelleyin, aksi halde dosyayı json verileriniz ile çarptı. Bu, güncelleme isteklerinin sayısına bakılmaksızın saniyede 1 sorgu anlamına gelir. Bunun cevabına ne zaman değdiğini görmek için bazı testler yapmalısınız, ancak alternatiften daha hızlı olacaktır. – savageguy

1

Prototype'ın kuyruklu yıldızı ve jetty webserver'u kullanarak eylemde 'kuyruklu yıldız' teknolojisinin bir örneğini görmekte fayda var. İskelenin indirilmesi için örnek kodun sohbet için bir örnek uygulaması vardır.Benim kurulum günlüğünü bulabilirsiniz yüzden son zamanlarda dalgakıran kendim yüklü

kullanışlı komutları:

Maven http://maven.apache.org/download.html#Installation kullanarak yükleme http://maven.apache.org/

bir kuyruklu yıldız servisi

İndir Maven'i çalıştırmaya çalışırken Başlarken Aşağıdaki komutları yaptım Eklendi: /home/sdwyer/apache-maven-2.0.9

> [email protected]:~/apache-maven-2.0.9$ export M2_HOME=/home/sdwyer/apache-maven-2.0.9 
> [email protected]:~/apache-maven-2.0.9$ export M2=$M2_HOME/bin 
> [email protected]:~/apache-maven-2.0.9$ export PATH=$M2:$PATH. 
> [email protected]:~/apache-maven-2.0.9$ mvn --version 
-bash: /home/sdwyer/apache-maven-2.0.9/bin/mvn: Permission denied 

> [email protected]:~/apache-maven-2.0.9$ cd bin 
> [email protected]:~/apache-maven-2.0.9/bin$ ls 
m2 m2.bat m2.conf mvn mvn.bat mvnDebug mvnDebug.bat 

> [email protected]:~/apache-maven-2.0.9/bin$ chmod +x mvn 

> [email protected]:~/apache-maven-2.0.9/bin$ mvn –version 

Maven version: 2.0.9 
Java version: 1.5.0_08 
OS name: “linux” version: “2.6.18-4-686″ arch: “i386″ Family: “unix” 
[email protected]:~/apache-maven-2.0.9/bin$ 

/home/sdwyer/jetty-6.1.3 için http://www.mortbay.org/jetty/ Özü gelen dalgakıran sunucusunu indirin

> [email protected]:~$ cd jetty-6.1.3//examples/cometd-demo 

> mvn jetty:run 

indirme Tamamen yığını çalıştırmak bir tarayıcı açık tamamlanmış ve işaret edin oluyor kez

: http://localhost:8080 ve demoları test edin.

örnek demolar için kod dizininde bulunabilir:

jetty-6.1.3/examples/cometd-demo/src/main/webapp/examples 
1

Hakkı ya da yanlış, bir hosting şirketi birkaç nedenden dolayı huysuz alabilirsiniz:

1) Oran olduklarını iyi apache prefork kullanarak. Her sohbet isteği büyük olasılıkla yeni bir bağlantı olacak ve böylece tek bir apache sürecini hızlandıracak. Her bir apache işlemi, 1mb bellekten 100 mb belleğe kadar her yerde yiyor. 2) Veritabanı sunucusunu koruyorlarsa ve siz, istemci veritabanı programlamasında çalışıyorsanız, veritabanlarını çekebilirsiniz. "Suck", "doğru olmayan indeksleme" den "güzel yağlar yerine küçük bir sorgulama yapar" anlamına gelir.

Yukarıda önerildiği gibi, kodunuzun kalıcı bağlantılar kullandığından emin olun. Ayrıca:

1) İstemcide bir yedekleme algoritması uygulayın. Etkinliği sırasında sunucuyu saniyede bir kez sorgulayın, ardından beş saniye sonra, sonra on, yirmi, vb. Geri dönüş yapın. Bu şekilde, hiçbir etkinlik olmadığında sunucuyu kırmazsınız.

2) Birden çok sekme sizi öldürür. Kullanıcı 10 sekme açar ve hepsinin sohbet widget'ını sunucuya saniyede bir sorgulama yapması sağlanır. Kötü haber. Ev sahibi sinirlenmemiş olsa bile, performansınız düşecektir.

Bu şey çok yoğunlaşırsa, sisteminizi, sohbet uygulaması bitlerini web uygulamanızın geri kalanından bağımsız olarak çalıştırabileceğiniz şekilde tasarlayın. Diğer kelimelerde, istemciler "chat.yourwebapp.com" adresine bir istekte bulunacaklar ve bu da lighttpd gibi bir şey üzerinde çalışıyor. Sen sunucuyla iletişim işlemek için yuvalarını kullanmak sonra sayfanın küçük Flaş film gömme ve düşünmek javascript

http://code.google.com/p/jsocket/

+0

Senin tür cevap için çok teşekkürler. Eğer nokta 1 numarasını açıklayabilirseniz seviniriz. Lighttpd çalıştıran yararları nelerdir? Pls açıkla. – Kunal

+0

Farklı sunucular, mesajlar ve kullanıcı listesi almak için iyi bir fikirdir. Ancak, oturumu farklı sunucular arasında nasıl koruyabilirim? Web servislerinin yardımcı olabileceğini düşünüyorum, ne düşünüyorsunuz? – Kunal

+0

Eğer session_id dosyanız data veritabanında saklanırsa ve çereziniz alanın en üstünde ise (www.alanadiniz.com yerine .adiniz.com), tüm sunucular aynı oturumu paylaşabilir. Oturum görevlilerinin çoğunun nasıl bir iş yaptığını gözden geçirin - oturumu sunucular arasında paylaşma çok zor değil :-) –

1

deneyin soketi. Bu, sunucudan çok miktarda yük alacaktır ve her şeyi senkronize halde tutmak için çok daha kolay olacaktır. Kullanıcı arayüzü hala JavaScript ile yapabilir.
JavaScript çözümünüzde kalacak ve sonra cevabımı sessizce yok sayıyorum :-)

0

yılında

+0

Hey, kulağa çok hoş geliyor. Böyle bir şey üzerinde ellerimi almak isterim. Ama sorun JS fonksiyonları ile nasıl bir flash filmi kontrol edebileceğimi ve sunucudaki mysql db ve php kodu ile nasıl iletişim kurabileceğimi bilmiyorum :( Yardımlarınız için teşekkür ederiz. – Kunal

İlgili konular