2009-11-05 62 views
0

我想通過XMLHttp(XHR)在我的網站上使用定期刷新(ajax)/輪詢來檢查用戶是否每10秒在數據庫上有新消息,然後如果有通知他/她通過動態創建一個div像這樣:定期刷新或輪詢

function shownotice() { 
    var divnotice = document.createElement("div"); 
    var closelink = document.createElement("a"); 
    closelink.onclick = this.close; 
    closelink.href = "#"; 
    closelink.className = "close"; 
    closelink.appendChild(document.createTextNode("close")); 
    divnotice.appendChild(closelink); 
    divnotice.className = "notifier"; 
    divnotice.setAttribute("align", "center"); 
    document.body.appendChild(divnotice); 
    divnotice.style.top = document.body.scrollTop + "px"; 
    divnotice.style.left = document.body.scrollLeft + "px"; 
    divnotice.style.display = "block"; 
    request(divnotice); 
} 

這是檢查消息的可靠或穩定的方式特別,因爲當我在看螢火蟲,有很多要求是怎麼回事我的數據庫?由於請求太多,此方法是否可以讓我的數據庫失效?有沒有另一種方式做到這一點,因爲當我登錄Facebook並檢查螢火蟲下,沒有請求正在發生或正在進行,但我知道他們也在使用定期刷新......他們如何做到這一點?

回答

2

您可以每10秒鐘檢查一次新數據,但不是檢查數據庫,而是需要執行較低的影響檢查。

我會做的是修改數據庫更新過程,以便在對某些數據進行更改時,還會更新文件上的時間戳以顯示最近發生的更改。

如果你想要比「在db中的某個地方改變的東西」更好的粒度,你可以通過用戶名(或其他標識符)將其分解。然後,要更新的文件將成爲每個可能對更新感興趣的用戶的用戶名。

因此,如果腳本詢問服務器是否有任何關於用戶X的信息比時間t更新,而不是進行數據庫查詢,則服務器端腳本可以將文件的時間戳與時間參數進行比較,然後查看如果數據庫中有新的東西的話。

在這個過程中正在更新數據庫,添加(大約)做代碼:

foreach username interested in this update 
{ 
    touch the file \updates\username 
} 

那麼你的功能,看是否有新的數據看起來類似:

function NewDataForUser (string username, time t) 
{ 
    timestamp ts = GetLastUpdateTime("\updates\username"); 
    return (ts > t); 
} 

一旦你發現有新的數據,你可以做一個完整的數據庫查詢,並獲得你需要的任何信息。

0

這是相當不可靠的,並且在大多數情況下可能對服務器徵稅太大。

也許你應該看看成推接口:http://en.wikipedia.org/wiki/Push_technology

我聽說彗星是最具擴展性的解決方案。

0

我懷疑Facebook使用Flash電影(他們總是下載一個名爲SoundPlayerHater.swf),他們用它來與他們的服務器做一些通信。這並沒有被Firebug抓到(儘管可能是Fiddler)。

3

我離開facebook打開螢火蟲運行,我看到每分鐘一次的請求,這對我來說似乎很多。

Comet使用的另一種方法是發出請求並讓它打開,服務器將數據帶到客戶端而不完成響應。這是一種黑客攻擊,違反了HTTP的全部原則:)。但它確實有效。

0

這不是一個更好的方法。因爲您最終每10秒鐘就會查詢一次服務器,即使沒有真正的更新。

代替這種輪詢方式,您可以模擬服務器推送(reverrse AJAXCOMET)的方法。這將簡化服務器工作負載,並且如果服務器端有更新,則只更新客戶端。

作爲每維基

反向的Ajax指的是使用長壽命的HTTP 連接以實現一個網絡服務器和 一個瀏覽器之間的低等待時間 通信一個Ajax設計 圖案。基本上它是 從客戶端向服務器發送數據的一種方式,並且 是用於將服務器數據 推回到瀏覽器的機制。

欲瞭解更多信息,請參閱我的similar question

其他響應