Skip to content

Instantly share code, notes, and snippets.

@alphp
Created January 9, 2019 21:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alphp/6af0bab9f1769d61843d22b363f84e31 to your computer and use it in GitHub Desktop.
Save alphp/6af0bab9f1769d61843d22b363f84e31 to your computer and use it in GitHub Desktop.
Query NTP time in PHP
<?php
function ntp_time ($host) {
$msg = hex2bin('e30004fa000100000001000000000000000000000000000000000000000000000000000000000000');
$data = false;
if ($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) {
if (@socket_connect($sock, $host, 123)) {
list($xmt['time2'], $xmt['time1']) = explode(' ', microtime());
$xmt['time1'] += 2208988800;
$xmt['time2'] *= 4294967296;
$msg .= pack('N*', $xmt['time1'], $xmt['time2']);
if (@socket_write($sock, $msg)) {
if ($recv = @socket_read($sock, 48)) {
$data = unpack('H2ntp.flags/C1ntp.stratum/C1ntp.ppoll/c1ntp.precision/N1ntp.rootdelay/N1ntp.rootdispersion/H8ntp.refid/N2ntp.reftime/N2ntp.org/N2ntp.rec/N2ntp.xmt', $recv);
$data['hex'] = bin2hex($recv);
$data['ntp.rootdelay'] = $data['ntp.rootdelay'] / pow(2, 16);
$data['ntp.rootdispersion'] = $data['ntp.rootdispersion'] / pow(2, 16);
$data['ntp.refid'] = implode('.', unpack('C*', hex2bin($data['ntp.refid'])));
$data['ntp.reftime1'] = sprintf('%u', $data['ntp.reftime1']) - 2208988800;
$data['ntp.reftime2'] = floor(1000000 * (sprintf('%u', $data['ntp.reftime2']) / pow(2, 32))) / 1000000;
$data['ntp.org1'] = sprintf('%u', $data['ntp.org1']) - 2208988800;
$data['ntp.org2'] = floor(1000000 * (sprintf('%u', $data['ntp.org2']) / pow(2, 32))) / 1000000;
$data['ntp.rec1'] = sprintf('%u', $data['ntp.rec1']) - 2208988800;
$data['ntp.rec2'] = floor(1000000 * (sprintf('%u', $data['ntp.rec2']) / pow(2, 32))) / 1000000;
$data['ntp.xmt1'] = sprintf('%u', $data['ntp.xmt1']) - 2208988800;
$data['ntp.xmt2'] = floor(1000000 * (sprintf('%u', $data['ntp.xmt2']) / pow(2, 32))) / 1000000;
}
}
}
}
if (!empty($sock)) socket_close($sock);
if ($data === false) {
$err_nbr = socket_last_error();
if (!empty($sock)) $err_nbr = socket_last_error($sock);
$err_msg = socket_strerror($err_nbr);
echo $err_nbr, ' - ', $err_msg, "\n";
}
return $data;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment