2012-03-16 3 views
0

Мне нужно запустить ту же задачу на разных вкладках/браузерах/клиентах в одно и то же время. Как можно ближе (за одну секунду, даже миллисекунду).Начать задачу одновременно с разными браузерами/клиентами?

То, что я сейчас
ОБЕ клиенты посылают запрос на сервер с помощью AJAX, когда они начинают вебсайт.
-Сервер принимает текущую метку времени (в секундах) и удаляет ее с 10 секунд. Затем отправляет оставшееся время клиентам.
-Клиенты получают оставшееся время, генерируют временную метку, добавляют оставшееся время в текущее время и ждут, пока он будет таким же или большим, а затем начните задачу.

PHP (Server)

<?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 ОГРОМНЫЙ вопрос: Есть много theorical и практические подходы к этому , но никто не работает отлично. Причиной этого является латентность сети, которая неожиданно изменяется. Вы должны изучить некоторые модели распределенных систем, которые могли бы помочь вам реализовать достойное решение, я думаю, что распределенный снимок, то есть

Смежные вопросы