我需要在同一时间在不同的标签/浏览器/客户端上启动相同的任务。尽可能接近(相同的秒,甚至毫秒)。
我现在拥有的
- 当他们启动网站时,两个客户端都通过AJAX向服务器发送请求。
-Server正在获取当前时间戳(秒)并将其从10秒内删除。然后将剩余时间发送回客户端。
-Clients接收剩余时间,生成时间戳,将剩余时间添加到当前时间并等到它相同或更大,然后开始任务。
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;
}
}
});
我的问题
- 我走对了路?
- 这是唯一这样做的方法吗?
- 可以做得更好吗?
- 如何最小化不同计算机/浏览器/标签之间的时差。
我想我应该考虑请求/响应时间并对它们进行一些计算但是在我继续之前我想确保没有其他更好的方法来实现我的目标并且我不会非常糟糕这个解决方案有问题。
答案 0 :(得分:1)
你应该使用setTimeout()
而不是像这样繁忙的循环,你应该调整你的期望,并意识到如果没有完全控制客户端机器,你就不能期望非常紧密的同步。
即使您要测量网络延迟,也不一定准确,因为它可能会因流量波动而突然改变等。
答案 1 :(得分:0)
时间同步是一个巨大的问题:有许多理论和实践方法,但没有一个很好。原因是网络延迟,它以意想不到的方式发生变化。您应该研究一些可以帮助您实现正确解决方案的分布式系统模型,我想到分布式快照,即