加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 将Javascript时钟与服务器时钟同步

发布时间:2020-12-13 21:39:15 所属栏目:PHP教程 来源:网络整理
导读:背景 我正在创建一个AJAX聊天系统.它看起来像这样: Mike – hi Jane – 5 minutes ago Jane – hi Mike – 4 minutes ago Mike – how’s it going – 3 seconds ago Jane – I’m doing good – 1 second ago Javascript每分钟轮询服务器,服务器响应10条最
背景

我正在创建一个AJAX聊天系统.它看起来像这样:

Mike – hi Jane – 5 minutes ago

Jane – hi Mike – 4 minutes ago

Mike – how’s it going – 3 seconds ago

Jane – I’m doing good – 1 second ago

Javascript每分钟轮询服务器,服务器响应10条最新消息.附加到每个消息的是Unix时间戳(PHP time()). Javascript负责将用户当前拥有的缓冲消息与此新服务器响应合并.消息的交错和“X time ago”消息的准确性取决于Javascript时钟与服务器时钟同步的程度.

你如何准确地将Javascript时钟与服务器时钟同步?以下是我到目前为止的情况.我想让它更准确.目前它没有考虑进行同步的Ajax的往返时间.我如何知道发送,处理和接收的往返比例?另外,你如何处理时钟晶体被破坏的用户 – 例如:格林威治标准时间晚上7点20分,但他们的时钟实际上是格林威治标准时间下午7:15?

Clock = {
   serverOffset = 0;

   synch: function() {
      new Ajax.Request(
         '/getServerTime.php',{
            onSuccess: function(transport) {
               this.serverOffset = parseInt(transport.responseText) - 
                  new Date().getTime() / 1000;
            }
         }
      );
   },getServerTime: function(myTime) {
      if (typeof(myTime) === 'undefined') {
         myTime = new Date().getTime() / 1000;
      }
      return myTime + this.serverOffset;
   },serverToMyTime: function(serverTime) {
      return serverTime - this.serverOffset;
   }
}

解决方法

正如我在 this answer中解释的那样,你的精确程度是有限的 – 本质上,任何小于请求往返时间的时钟偏差都是不可检测的.如果您确实需要时间尽可能精确,请为服务器创建一个特殊的请求类型,以获取时间,并尽可能快地进行往返.

但是,您可以识别本地时钟明显疯狂的浏览器,因为观察到的服务器时间不会落在请求的本地开始和结束时间之间.由于您无法将其收紧得太远,只需在本地请求[start,end]间隔内选择一个任意时间,并将其视为等同于接收的服务器时间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读