2012-03-16 74 views
0

我需要在同一時間在不同的標籤頁/瀏覽器/客戶端上啓動相同的任務。儘可能接近(同一秒,甚至毫秒)。在不同的瀏覽器/客戶端同時啓動任務?

我現在所擁有的
導向軸客戶端通過AJAX當他們開始在網站發送請求到服務器。
- 服務器將當前時間戳記(秒)並從10秒中刪除它。然後將剩餘時間發回客戶端。
- 客戶端接收剩餘時間,生成時間戳,將剩餘時間添加到當前時間並等待至相同或更大,然後開始的任務。

PHP(服務器)

<?php 
// Remove dot on timestamp 
$timeStamp = str_replace('.', '', microtime(true)); 

// Make it same as JS one (13 symbols) 
if (strlen($timeStamp) > 13) { 
    $timeStamp = substr($timeStamp, 0, -1); 
} 

// I want last 4 digits - 1st is second, rest 3 are microseconds 
$timeStamp = substr($timeStamp, 9, 4); 

// Remove time from 10 seconds and we get how many seconds left till start (meaning we start task every 10 seconds on server) 
echo 10000 - $timeStamp; 

JS(客戶端)

$.get('ajax.php', function(data){ 
    // Current date 
    var newDate = new Date().getTime(); 

    // Start date 
    playDate = newDate + parseInt(data); 

    // Waiting for current date to be same or greater than start date 
    while (true){ 
     if (playDate <= new Date().getTime()){ 
      alert('DONE'); // It is pretty close, but not excatly 
      break; 
     } 
    } 
}); 

我的問題(一個或多個)
-Am我要以正確的方式?
- 這是做到這一點的唯一方法嗎?
可以做得更好嗎?
- 如何最小化不同計算機/瀏覽器/選項卡之間的時間差異。

我想我應該考慮請求/響應時間,並與他們做一些計算,但在繼續之前,我想確保沒有其他更好的方法來實現我的目標,我不會去這個解決方案非常錯誤。

回答

1

你應該使用setTimeout()而不是像這樣的繁忙循環,你應該調整你的期望,並認識到如果沒有完全控制客戶端機器,你不能指望非常接近的同步。

即使你是衡量網絡延遲,這並不一定準確,因爲它可以因流量波動突然改變等

0

時間sinchronization是一個巨大的問題:有很多的理論與實踐的方法來此,但沒有一個很好。其原因是網絡延遲,以意想不到的方式發生變化。你應該研究一些分佈式系統模型,可以幫助你實現一個體面的解決方案,我想分佈式快照,即

相關問題