2009-03-02 39 views
4

我已經使用php,mysql和jquery製作了一個聊天腳本。它使用json從服務器獲取數據。它使用最後獲取的消息ID向服務器發出固定間隔請求,以從服務器獲取新消息。但是,當多個用戶聊天時,一小時內就會向服務器發送數千個請求,而託管人員會確定地阻止它。如何使用jQuery,PHP和MySQL實現聊天?

Th gmail聊天使用socket我想。因爲它確實不會發送固定的時間間隔請求。請你們中的任何一個給我一些示例代碼或一些方向來解決這個問題。

我需要幫助,絕望。

非常感謝提前。我對所有人的尊重和問候。

回答

7

如果您正在使用的主機會「確實阻止它」,如果它提出了很多請求,那麼您可能需要考慮在擔心代碼之前獲取不同的主機或升級主機軟件包。看看我們選擇了從 給另一位用戶獲取文本的方法如何Facebook implements their chat:

涉及裝載 每個Facebook頁面的iframe,並 具有iframe的JavaScript通過 在持久 連接HTTP GET請求直到 服務器有客戶端的數據纔會返回。 如果 中斷或超時,請求將重新建立。這不是 通過任何方式一種新技術:它是彗星的 變化,特別是長輪詢和/或BOSH的XHR 。

+0

非常感謝您的善意幫助。真的很感激它。 – Kunal 2009-03-02 17:17:31

+0

即使我使用iframe來製作跨域的ajax請求。我的聊天腳本將安裝在其他網站上,但消息和用戶列表將在我的服務器上。儘管需要了解更多關於持續連接的信息,但是如果你有空閒時間,會很感激一些提示。感謝雅虎! – Kunal 2009-03-03 04:25:25

0

爲什麼主機會阻止它?如果你的主機不允許那麼做一個標準的http請求,那麼是時候切換了。

至於使用套接字,沒有原生的能力通過JavaScript連接到套接字,但我相信JSocket是一個lib,允許您通過實際連接到您的服務器的嵌入式閃存橋接套接字。還沒有找到一個這樣做的jquery插件,可能是一個。

您的服務器端代碼也會發生巨大變化(持久性vs輪詢非常不同),因此您可以爲自己的工作做好準備。

我建議你只是在做你正在做的事情,並升級你的主機,如果它無法處理它。除非你一次擁有大量的用戶?一個緩存系統可以讓你在每一個請求中都不會碰到數據庫,如果它忙的話可能會加快速度。

+0

Ho w can we add caching from the page from which I sedning json data to the client?請指教。 – Kunal 2009-03-02 17:19:51

+0

當然。假設您每秒平均有300次更新請求,這通常會轉化爲每秒300分貝的查詢次數。你可以有一個簡單的文件,其中包含最新的json數據,在每個請求上檢查文件的最後一個mod,如果它老一秒,打你的db和...(限制) – savageguy 2009-03-02 19:22:17

1

您可能會發現使用Prototype的彗星守護程序和jetty webserver看到一個「彗星」技術的例子很有用。碼頭下載中的示例代碼有一個聊天示例應用程序。

我最近安裝的碼頭自己,所以你可能會發現一個日誌我安裝的命令非常有用:

入門試圖從http://maven.apache.org/

運行一個彗星服務

下載Maven Maven的使用http://maven.apache.org/download.html#Installation 安裝我做了以下命令: 提取到/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$ 

http://www.mortbay.org/jetty/ 提取下載碼頭服務器/home/sdwyer/jetty-6.1.3

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

> mvn jetty:run 

下載的整個堆棧運行

一旦它完成了,打開瀏覽器並指向: http://localhost:8080並測試演示。

的例子演示代碼可以在目錄中找到:

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

對還是錯,託管公司可能會胡思亂想的一對夫婦的原因:

1)賠率是好的,他們是使用Apache prefork。每個聊天請求可能會成爲一個新的連接,從而生成一個單一的Apache進程。每個apache進程都可以從1mb的內存到100mb的內存。 2)如果他們維護數據庫服務器,並且你,客戶端在數據庫編程上吸引人,你可以敲擊他們的數據庫。 「吸」意味着任何從「沒有適當的索引」到「使得一些微小的查詢而不是很好的胖子」。

如上所示,確保您的代碼使用持久連接。另外:

1)在客戶端實現退避算法。在活動期間每秒輪詢一次服務器,然後退回到五秒鐘,然後是十秒鐘,二十秒鐘等......這樣,當沒有任何活動時,您不會敲擊服務器。

2)多個標籤會殺了你。用戶打開10個選項卡,他們都有你的聊天窗口小部件每秒輪詢一次服務器?壞消息。即使你的主人不生氣,你的表現也會降低。

如果這件事情變得巨大,請設計您的系統,以便您可以獨立於Web應用程序的其餘部分運行聊天服務器位。換句話說,客戶端會向「chat.yourwebapp.com」發出請求,而這個請求又會運行在lighttpd之類的東西上。

0

你想想在頁面中嵌入一個小的Flash影片,然後使用套接字來處理與服務器的通信。這將花費很多來自服務器的負載,並且使保持所有內容同步變得更容易。用戶界面仍然可以使用JavaScript。
它你會留下你的JavaScript解決方案,然後默默地忽略我的答案:-)