2010-07-21 46 views
0

現在對我的javascript聊天安裝工程,以便它就像如何使一個JavaScript/PHP的聊天室更有效的加載時間和SQL通信方面

function getNewMessage() 
{ 
    //code would go here to get new messages 
    getNewMessages(); 
} 
getNewMessages(); 

和函數中我會使用jQuery做一拿到後檢索從PHP紙條這將 1.啓動SQL連接 2.驗證,這是一個合法的用戶通過SQL 3.自上次訪問用戶4. 接近SQL

僅檢索新郵件消息

這個工程很好,聊天工程pe rfectly。我擔心的是,這是打開和關閉很多SQL連接。這很快,但我現在想製作一個小型的多人遊戲,並且每秒傳輸用戶座標以及數十個其他變量,每秒3次,其中我每次打開和關閉sql連接並提取信息從大量表格中可以看出,每次都可能效率不夠高,無法順利運行,並且可能會對服務器造成太大的壓力。

有沒有更好的更有效的方式來溝通所有這些變量,我應該知道哪些在我的服務器/數據庫上不那麼難?

+0

你試過持續連接? – Wrikken 2010-07-21 00:41:21

+0

http://php.net/manual/en/function.mysql-pconnect.php – 2010-07-21 00:49:53

回答

2

不要持續連接,除非它是提供給您的唯一解決方案!

當MySQL檢測到連接已被刪除時,所有臨時表都被刪除,任何活動事務被回滾,並且所有鎖定的表都被解鎖。即使腳本崩潰,持久連接也只會在Apache小孩退出時放棄,而不是在腳本結束時放棄!您可以在事務中繼承連接。更糟的是,其他請求可能會阻止,等待這些表解鎖,這可能需要相當長的時間。

除非您有測量連接需要多長時間並將其確定爲腳本運行時間的很大比例,否則不應考慮使用持久連接。事實上,如果你擔心績效,那應該是你在這裏做的。查看xhprofxdebug,分析您的代碼,然後開始優化。

0

也許嘗試使用不同的方法從服務器獲取新消息:Comet

使用這種技術,你不必打開那麼多的新連接。

+0

我很喜歡這個,但每個連接都使用自己的進程。如果我在聊天室中有很多用戶,這會導致問題,對吧? – Macmee 2010-07-21 02:22:41

+0

取決於你用什麼來執行你的PHP /哪個網絡服務器等... – TheHippo 2010-07-21 10:26:33

+0

我認爲我的虛擬主機(Justhost)使用mod_apache。這裏沒有太多的擺動空間! – Macmee 2010-07-21 15:20:36

0

同時有幾十個玩家不會傷害到數據庫,或者如果你有高效的SQL語句會導致明顯的滯後。可能您的數據庫將託管在同一臺服務器上,或者至少與您的遊戲或網站具有相同的網絡,因此不用擔心。如果您的數據庫恰好託管在運行裝有MSDOS的8位16mz板的獨立服務器上,該服務器位於亞馬遜的遠程位置,通過無線電波連接到由醉猴子操作的曲柄發動機,您將處於你自己與這一個。

否則,您真的應該更擔心您傳遞給玩家的數據量。如果您爲整個世界中的所有對象來回傳遞座標,則即使數據庫查詢需要幾分之一秒,頁面加載也可能花費很長時間。有時在遊戲中通過「戰爭迷霧」功能可以克服這一點,該功能不會通知用戶整個地圖中的每個對象,而只是那些位於玩家即時範圍內的對象。這可以通過單個SQL查詢輕鬆完成,其中對象座標靠近玩家。雖然,如果你有一個吝嗇的主機,他們會關心連接和查詢的數量。

如果你擔心吸引更多的球員比,考慮探索緩存方法,如建設前期做空的文件存儲常用獲取的記錄或值使用fopen()fgets()fclose(),等等。或者,使用PHP擴展像apc到將值存儲在內存中,從頁面加載到頁面加載持續存在。 memcachememcached的行爲也類似,但其行爲類似於可連接到的單獨服務器,存儲可與其他頁面匹配共享的值以及查詢。

要更新緩存的頁面或值,當您認爲它們可能過時時,可以每隔一段時間運行一次cron作業以更新這些文件或值。如果您的主機不允許執行cron作業,請考慮讓您的guest虛擬機執行此項操作:某頁上的一行腳本將在一定數量的頁面命中後使用來自數據庫查詢的新值刷新緩存。或者緩存一個日期值以檢查每一頁命中,如果過了很多時間,刷新緩存。同樣,除非你處於一個吝嗇主機的壓迫之下,或者除非你一次獲得了一百次或更多的頁面命中,否則不需要關心數據庫。數據庫並不那麼脆弱。如果他們遇到一陣歇斯底里的衝突,任何時候都會有不止一次的問題出現,那麼製作它的工程師就不會長時間工作。

0

我知道這是一個相當煩人的「答案」,但也許你應該考慮這個不同的方式,畢竟這不是關係數據庫最強大的用法。您是否考慮過XMPP解決方案?海事組織這將是這項工作的最佳工具,而現在ejabberd和openfire都是微不足道的。優秀的Strophe庫可以使前端故事變得輕鬆,並且作爲額外的獎勵,您可以獲得HTTP綁定(如commet),因此您不需要輪詢服務器,延遲時間就會縮短,您將生成更少的HTTP流量。

我知道這是不太可能的,你會改變你的整個方法,因爲我只是這麼說,但想提供一個替代視角。

http://www.ejabberd.im/ http://code.stanziq.com/strophe/