我找到了以下服务:
http://currentmillis.com/api/millis-since-unix-epoch.php
请记住,对于任何寻求类似解决方案的人来说,网络延迟和一般不可预测的因素肯定会使返回值偏离真实时间。您必须将这些影响因素考虑在内!
更新:
在使用上述服务几天后,很明显我需要比当前托管的连接更高的可靠性。我的解决方案是构建一个基于 PHP 的客户端,通过与附近 NTP 服务器的直接套接字连接来实现。在典型的通话中,我的往返时间大约为 7 到 15 毫秒。
您的结果可能会有所不同,具体取决于您自己的服务器以及您选择的 NTP 提供商。您可以找到第 2 层服务器 here,以及使用 general pool。正如这些其他帖子中提到的,不要不断地轮询这些提供商,而是限制您的呼叫并根据呼叫时间进行调整。
这是我的“客户”代码:
function RemoteNTP($Host) {
$Sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); // Create socket
socket_connect($Sock, $Host, 123); // Connect over port 123 for NTP
$Str = "\010" . str_repeat("\0", 47); // Create string for binary transmission
$Trip -= round(microtime(true)*1000); // Grab time of call
socket_send($Sock, $Str, strlen($Str), 0); // Send transmission
socket_recv($Sock, $Response, 48, MSG_WAITALL); // Receive formatted response
$Trip += round(microtime(true)*1000); // Adjust call time variable
socket_close($Sock); // Close socket
$Data = unpack('N12', $Response); // Format as an array we can work from
$Secs = $Data[11]-2208988800; // Convert to secs since 1970, from 1900 for NTP
$Frac = $Data[12]/4294967296; // Fraction of sec, out of 2^32 (32 bits)
$Time = ($Secs*1000)+round($Frac*1000); // Combine for full ms value
$Time += round($Trip/2); // Measure and adjust this for better accuracy
return $Time; // Returns number of milliseconds passed since 1970-01-01
}
可以这样调用:
$Ntp = GetRemoteNTP('0.pool.ntp.org');
您将根据持续检查来调整 $Trip 的修饰符,从而确定每次通话的往返时间的实际值,从而获得更准确的行程时间。 (我实际上详细跟踪了我的,但想以模块化的方式发布它,并将跟踪机制的选择留给实施者。)您将通过磨练靠近您的服务器的 NTP 提供程序来提高可靠性,但是如果利用池,您可能还希望通过将 # 的 0-4 附加到主机 url 并为每个请求循环来“循环”您对池服务器的调用。
另外请记住,这应该被视为最后的解决方案。 NTP 框架经过精心设计,成为一个强大而全面的系统,用于维护非常准确的系统时间。这是一种低级的、自我纠正的机制,它比像这样的自制 hack 做得更好。由于我的具体情况,我采用了这里使用的方法;系统时钟中可能有更好的替代方案可供您使用,通过 nptd 自动调整。