我目前正在开发一个websever,它将创建一个其他服务器的快速诊断仪表板。
我的要求是显示这些远程服务器的时间,似乎NTP会产生一些问题,我希望看到这一点。
我目前在桌面上有一个bat文件,只需发送
net time \\SRV*******
我也尝试过:
echo exec('net time \\\\SRV****');
=>结果是' 0'
但我想在PHP中找到更好的解决方案,以便团队中的任何人都可以在网页上阅读它。
知道我会做什么吗?
注意:这与How to get date and time from server广告无关我希望获得REMOTE服务器而非本地服务器的时间
答案 0 :(得分: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";
}
答案 1 :(得分:0)
您可以将powershell脚本与WMI一起使用(假设您的服务器是Windows机器)
这将比旧的net time
样式更快。</ p>
脚本需要使用Domain-Admin(或具有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分钟执行一次计划任务。
如果你想用秒/分钟显示时间&#34;&#34; (我不经常查询每个服务器,因为时间不会快速改变),你可以添加一点数学:
执行脚本时,请不要存储实际时间,而是将每个服务器的offset
与您的网络服务器时间进行比较。 (即+2.2112
,-15.213
)
当您的用户访问&#34;仪表板&#34;加载这些偏移量并显示网络服务器当前时间+/-每台服务器的偏移量。 (可能是&#34;过时&#34;然后是几微秒,但你关心吗?)
答案 2 :(得分:0)
为什么这么复杂?
刚刚发现这是有效的:
<p onmouseover="this.style.color = 'black;">This text should be changed</p>
<h1>How to change this element when hovered on p element</h1>