Php 将Javascript时钟与服务器时钟同步

Php 将Javascript时钟与服务器时钟同步,php,javascript,time,clock,Php,Javascript,Time,Clock,背景 我正在创建一个AJAX聊天系统。它看起来像这样: 迈克-你好,简-5分钟前 简-你好,迈克-4分钟前 迈克-情况如何-3秒钟前 简-我做得很好-一秒钟前 Javascript每分钟轮询一次服务器,服务器会响应10条最新消息。每条消息都附有一个Unix时间戳(PHP time())。Javascript负责将用户当前拥有的缓冲消息与此新服务器响应合并。消息的交错和“X time ago”消息的准确性取决于Javascript时钟与服务器时钟的同步程度 问题 如何准确地将Javascript

背景

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

迈克-你好,简-5分钟前

-你好,迈克-4分钟前

迈克-情况如何-3秒钟前

-我做得很好-一秒钟前

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;
   }
}

我们也遇到过类似的问题。我们的解决方案是忽略浏览器时钟。如果消息带有服务器时间戳,只需按该时间戳排序即可。然后,您只需在显示数据时将其转换为浏览器时间即可。不过,所有的计算和排序都基于服务器时间。这样,您所要做的就是保持服务器的时间同步。

正如我在中所解释的,您的精确程度是有限的——本质上,任何小于请求往返时间的时钟偏差都是无法检测的。如果您确实需要尽可能精确的时间,请向服务器创建一个特殊的请求类型,以获取时间,并尽可能快地完成往返


不过,您可以识别本地时钟明显不正常的浏览器,因为观察到的服务器时间不会介于请求的本地开始时间和结束时间之间。由于您无法将其压缩得更远,因此只需在本地请求[start,end]间隔内选择任意时间,并将其视为与接收到的服务器时间相等。

使用闪存和套接字服务器。如果你需要100%准确。我为一个应用程序编写了一个套接字服务器,它每1秒向一个flash元素广播一次时间,并准确地告诉它要显示什么

这是一个基于金融的应用程序,它需要始终100%准确

我们还将其与FMS配对,以便能够穿越公司防火墙

如果您使用javascript,您将无法实现准确性


html5可能很快就会用套接字解决这个问题。请注意,这需要服务器将您自己的消息回显给您——我猜OP目前没有这样做,但我肯定会推荐这种方法。让服务器将消息回显到发送它们的客户端意味着每个人对会话都有相同的看法!这包括两个人实际上在同一时间按enter键的情况。服务器首先收到的消息将首先出现在两个客户端中。服务器和数据库=>UTC