2017-02-10 124 views
1

我目前正在研究一个将创建其他服务器的快速诊断仪表板的websever。如何获取远程服务器的时间?

我的要求是显示这些远程服务器的时间,似乎NTP创建了一些问题,我希望看到。

我现在有我的桌面上一个bat文件,简单地发送

net time \\SRV******* 

我也曾尝试:

echo exec('net time \\\\SRV****'); 

=>结果是 '0'

但我想在PHP中寻找更好的解决方案,这样任何团队成员都可以在网页上阅读。

任何想法我会做什么?

注:这是不相关的广告How to get date and time from server我希望得到一个远程服务器的时间,而不是本地服务器

+1

的可能的复制[如何从服务器获取日期和时间(http://stackoverflow.com/questions/6621572/how-to-get-date - 从服务器中获取时间) – Veve

+1

@Veve这个是关于REMOTE服务器的时间。 – dognose

+0

您的网络服务器使用哪种操作系统? – dognose

回答

1

您可以使用NTP协议来从远程服务器检索日期时间。

试试这个代码:

error_reporting(E_ALL^E_NOTICE); 
ini_set("display_errors", 1); 

date_default_timezone_set("Europe/..."); 

function query_time_server ($timeserver, $socket) 
{ 
    $fp = fsockopen($timeserver,$socket,$err,$errstr,5); 
     # parameters: server, socket, error code, error text, timeout 
    if ($fp) { 
     fputs($fp, "\n"); 
     $timevalue = fread($fp, 49); 
     fclose($fp); # close the connection 
    } else { 
     $timevalue = " "; 
    } 

    $ret = array(); 
    $ret[] = $timevalue; 
    $ret[] = $err;  # error code 
    $ret[] = $errstr; # error text 
    return($ret); 
} 


$timeserver = "10.10.10.10"; #server IP or host 
$timercvd = query_time_server($timeserver, 37); 

//if no error from query_time_server 
if (!$timercvd[1]) { 
    $timevalue = bin2hex($timercvd[0]); 
    $timevalue = abs(HexDec('7fffffff') - HexDec($timevalue) - HexDec('7fffffff')); 
    $tmestamp = $timevalue - 2208988800; # convert to UNIX epoch time stamp 
    $datum = date("Y-m-d (D) H:i:s",$tmestamp - date("Z",$tmestamp)); /* incl time zone offset */ 
    $doy = (date("z",$tmestamp)+1); 

    echo "Time check from time server ",$timeserver," : [<font color=\"red\">",$timevalue,"</font>]"; 
    echo " (seconds since 1900-01-01 00:00.00).<br>\n"; 
    echo "The current date and universal time is ",$datum," UTC. "; 
    echo "It is day ",$doy," of this year.<br>\n"; 
    echo "The unix epoch time stamp is $tmestamp.<br>\n"; 

    echo date("d/m/Y H:i:s", $tmestamp); 
} else { 
    echo "Unfortunately, the time server $timeserver could not be reached at this time. "; 
    echo "$timercvd[1] $timercvd[2].<br>\n"; 
} 
+0

我认为这只适用于每台服务器都充当ntp-server,通常在本地域内不是这样。 – dognose

+0

必须将服务器设置为充当NTP服务器 - Windows配置https://support.microsoft.com/en-us/help/816042/how-to-configure-an-authoritative-time-server-in-windows-服务器,Linux(CentOS)配置 - http://www.tecmint.com/install-ntp-server-in-centos/ –

0

您可以使用WMI(假设你的服务器是Windows机器)

这将是比旧net time风格的方式更快沿着使用PowerShell脚本。

的脚本需要有一个域管理员(或具有WMI查询权限的任何其他用户)执行

$servers = 'dc1', 'dc2', 'dhcp1', 'dhcp2', 'wsus', 'web', 'file', 'hyperv1', 'hyperv2' 

ForEach ($server in $servers) { 
    $time = "---" 
    $time = ([WMI]'').ConvertToDateTime((gwmi win32_operatingsystem -computername $server).LocalDateTime) 
    $server + ', ' + $time 
} 

您可以用计划任务实现这一目标,每5分钟。

如果你想显示的时间“以秒/分钟”(我不会查询每个服务器过于频繁,因为时间不会更改快),你可以加点数学:

当执行该脚本不会存储实际时间,而只是每个服务器的offset,与您的网络服务器时间相比。 (即+2.2112,-15.213

当用户访问“仪表板”时,加载这些偏移量并显示Web服务器当前时间+/-每个服务器的偏移量。 (可能会“过时”了几微秒,然后呢,但是你在意吗?)

0

为什么这么复杂?

就发现,这是工作:

echo exec('net time \\\\SRV****, $output); 
echo '<pre>'; 
print_r($output); 
echo '</pre>'; 
相关问题