-3

检查此链接 http://tinyurl.com/l96z2m2

它使用 javascript 检索客户端设备时间,使用 php 检索服务器时间。延迟是网络往返时间,即发送请求和收到响应之间的时间。

我想在同一点比较两次。不得不忽略网络延迟。

应该可以通过计算“在客户端发送的请求”和“在服务器收到的请求”之间的时间或“在服务器收到的请求”和“在客户端收到的响应”之间的时间。

索引.html

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" ></script>
<script>
var b = new Date();
$.getJSON("http://localhost/json.php?callback=?", function(data){
var a = new Date();
document.write("|Client-"+a.getUTCHours()+":"+a.getUTCMinutes()+":"+a.getUTCSeconds()+":"+a.getUTCMilliseconds()+"|    Server-"+data.time);
  var c = a - b;
document.write("|delay-"+c);
});
</script>

json.php

<?php
$callback = $_GET["callback"];

function udate($format, $utimestamp = null) {
if (is_null($utimestamp))
$utimestamp = microtime(true);

$timestamp = floor($utimestamp);
$milliseconds = round(($utimestamp - $timestamp) * 1000000);

return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
}

 $t =  udate('H:i:s:u');

 echo $callback . "({
 \"time\":\"$t\"

 })";
 ?>
4

2 回答 2

2

看起来您正在 HTTP 中重新执行 NTP。您可以查看 NTP 协议的工作原理http://en.wikipedia.org/wiki/Network_Time_Protocol

简而言之,您可以轻松测量服务器和客户端之间的往返时间。并且 NTP 假设两次行程(客户端 -> 服务器和服务器 -> 客户端)之间的时间是对称的。

您可能希望运行此时钟偏差计算 3 次以上,并且至少运行 3 次以获得更好的测量结果。

另请注意,您的 RTT 包括在 OS/HTTP 堆栈上花费的时间,因此最终数字可能不如 NTP 协议准确。

于 2013-07-18T06:22:50.073 回答
0

重要的是要意识到这并不像花费服务器时间和客户端时间并计算不同来获得网络延迟那么简单......

如果您采用客户端 UTC 时间和服务器 UTC 时间,则无法保证网络延迟是两者之间的差异,因为客户端可以更改它们的时间并使其无效。

但是,如果您认为这是延迟,您将执行以下操作:

JavaScript:

var d = Date.UTC();

返回指定日期与 1970 年 1 月 1 日午夜之间的毫秒数

PHP:

<?php
    //Get miliseconds since 1970
    $time = time() * 1000;
    echo $time;
?>

在 PHP 中,您可以简单地调用 time() 以获取自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的时间(以秒为单位)。如果您想要毫秒,只需执行 (time()*1000)。

使用上面的方法创建一个 PHP RESTful 服务,然后在 JavaScript 中使用 ajax 调用该服务,或者执行 PHP 部分,然后在 JavaScript 中比较两者,方法如下:

<script type="text/javascript">
    var serverTime = "<?php Print(time() * 1000); ?>";
    var clientTime = Date.UTC();
    var delay = clientTime - serverTime;
</script>
于 2013-07-18T06:16:16.420 回答