2012-07-11 51 views
1

原諒沒有問題。 我試圖建立一個與聊天室功能相同的網站。每個房間(有數千個房間)有5-50位觀衆的想法非常真實,只有大約1%的房間會聊天。使用PHP/MySQL的可擴展的聊天室?

我已經有了一些想法,但是我想出的所有東西似乎都需要瘋狂的處理能力......這樣做有效嗎?

回答

1

你問一個非常寬泛的問題,而是:

存儲每個消息在數據庫中的一行,使用AJAX重新加載聊天窗口中的內容與最後幾條消息如

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' ORDER BY `id` DESC LIMIT 100 

將爲聊天室選擇最近的100條消息。循環播放結果並根據需要顯示所有消息。

如果你的數據庫用戶有權創建表,你也可以動態地創建每個聊天室的桌子(這將是一個很大更快的性能明智)

那麼你只需在inputtextarea一個表單,在提交時,向數據庫插入一個新行(下次重新加載聊天窗口時將顯示給每個人)。

另一種更優化的方法是隻通過將每條消息的時間戳存儲在數據庫中,並將最後一次請求的時間戳存儲在JavaScript本地,然後使用查詢如:

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' AND `timestamp` > 'LAST_REQUEST' ORDER BY `id` DESC LIMIT 100 

然後將結果附加到聊天窗口,而不是替換它。

+0

但是,不會覺得我的服務器像瘋了嗎? 1000個用戶每秒選擇100 *進行選擇? – user1516606 2012-07-11 04:54:01

+0

假設你每秒刷新一次,難道不是1000個用戶正在做1次選擇? – wyqydsyq 2012-07-11 05:00:51

+0

抱歉打字錯誤,但仍然與我計劃維護的用戶數量有關,我認爲我的服務器無法處理它。 – user1516606 2012-07-11 05:21:45

2

有(IRCD,見http://www.atheme.org/project/charybdis和類似)。但是,如果你真的想另起爐竈,你可能會想要一個託管解決方案,它具有物理RAM一個像樣的量爲此目的設計的具體方案,和共享內存擴展(如:APC)

共享內存功能(APC在這種情況下)將保持同步每個人的對話以最快的方式,不帶硬盤紡紗太多或以其他方式MySQL的一發不可收拾的控制。您應該能夠以這種方式容納數百個併發請求,而服務器不會冒汗,因爲它不會對MySQL徵稅。它幾乎直接讀取RAM芯片。

您可以密鑰存儲單個頻道進行會話(例如:「channel-#welcome」),並通過AJAX直接輪詢它們。有關更多信息,請參閱apc_storeapc_addapc_fetch

即使最終因爲某種原因在MySQL中存儲會話,仍然最好使用某種內存緩存來讀取數據,因爲這會佔用數據庫服務器的巨大負擔。

如果你這樣做,最好是讓你的數據庫innodb,因爲它們在寫入時不會鎖定。使用APC,您的限制試劑將是您想要保存在共享緩衝區中的RAM數量和對話長度。

+0

欣賞漫長的答案,非常有趣。你會推薦使用Comet的APC方法嗎? (http://stackoverflow.com/questions/4174521/how-to-implement-a-chat-room-using-jquery-php?rq=1) – user1516606 2012-07-11 05:18:44

+0

請請不要重新發明這個輪子。採取他的建議的第一部分,並使用已經設計的程序來處理聊天。在PHP和MySQL中構建一個聊天服務器是一個很糟糕的主意。 – 2012-07-11 05:57:09

+0

@GavinTowey感謝您的建議,但理解/實施ircd/charybdis看起來好像超過了我的技能水平。我很高興不使用MySQL,只要我對代碼的工作原理有了很好的理解,所以如果問題稍後發生,我可以很容易地看到問題出在哪裏。 – user1516606 2012-07-11 08:45:14