2011-11-23 47 views
3

我想嘗試在多個瀏覽器/客戶端之間保持計時器同步,這些瀏覽器/客戶端正在倒計時到存儲在數據庫中的日期。如果由於某種原因日期發生變化,那麼我需要適當更新計時器。這將最終成爲我正在嘗試創建的這款JavaScript遊戲的一部分,但在我真正能夠繼續之前,我需要遊戲的核心。通過數據庫中存儲的日期/時間在多個瀏覽器中保持倒數計時器同步

這個計時器基本上是動態的,因爲如果需要的話,需要很容易地改變時間。我想出了通過PHP腳本輪詢數據庫的想法,每秒都會進行更改,這也有助於跨瀏覽器同步定時器。但是,這似乎是相當服務器密集型的,並且如果存在潛在的延遲,實際上可能不實際同步定時器。

任何想法會有幫助,謝謝。

SQL:

CREATE TABLE timer(
    timer_id INT  PRIMARY KEY AUTO_INCREMENT, 
    timer_date DATETIME NOT NULL 
); 

JQuery的:

$(document).ready(function() { 
      $('#button').click(function() {      
       //get timer id 
       var timerId = $('#button').attr('tid'); 
       //disable button 
       $('#button').attr('disabled', 'disabled');    
       //send ajax request 
       $.ajax({ 
        url: "process.php", 
        type: "POST", 
        data: "id="+timerId, 
        dataType: "json", 
        success: function(data){ 
         //IF TIMER HAS CHANGED UPDATE ELSE DON'T DO IT 

         //re-enable button   
         $('#button').removeAttr("disabled"); 
        } 
       }); 
      }); 
+0

定時器需要的實際時間有多接近?你允許的錯誤是什麼? – JesseBuesking

+0

@JesseB儘可能的說實話,但我知道要保持它們的準確性非常困難。 –

+1

是否http://stackoverflow.com/questions/2663882/how-does-facebook-chat-avoid-continuous-polling-of-the-server以任何方式幫助你? – JesseBuesking

回答

2

您有兩種選擇,即投票或TCP keepalive。或者應該工作,但輪詢更容易實施。

想想你在爲你的遊戲客戶提供一個web服務的方面。從客戶的角度來看,它並不關心涉及數據庫。因此,考慮到這一點,請設置您的時間戳URL(例如,sync.php),然後在memcache等內存中設置一些內容以存儲數據,這樣您就不會一直造成數據庫開銷。

我也很想在客戶端的關鍵路徑。你真的需要每秒輪詢嗎?如果是這種情況,網絡延遲可能只是一個因素。你的客戶應該有足夠的智慧來知道某件事是否依賴於時間的準確性,並且你應該對此進行編碼。

更新1:

在回答您的代碼示例,我想建議你看看使用GET而不是POST進行輪詢,因爲你沒有真正改變系統的狀態,但嘗試從它檢索信息(我從你的問題推斷這一點,因爲代碼似乎你實際上改變系統的狀態)。

+1

請注意,這個答案是針對未經編輯的帖子版本的。 – hafichuk

+0

是的,目前它只是檢索數據,我知道代碼示例非常簡單,我只是把它放在一起試圖展示我的目標。時間似乎是這個項目的一個真正的問題! –

+1

由於時間是關鍵,所以您可能*不想*閱讀以下內容:http://www.doolwind.com/blog/how-to-write-perfect-code/。簡而言之,如果您正在進行原型設計,那麼只需編寫代碼,不用擔心實現它的最佳方式。 – hafichuk

1

的問題是相當廣泛的,但如果時間可以在任何第二個變化,你需要輪詢服務器每秒。

如果此時間對所有用戶都是全球性的,那麼如果您擔心每秒會有數千次PHP請求,則可以生成一個靜態文件。

至於等待時間,你可以在任務之前和之後在客戶端之間嘗試準確的「實時」,確實執行getTime()。

那就是我所做的。

相關問題