【问题标题】:How can I get the time of a remote server?如何获取远程服务器的时间?
【发布时间】:2017-02-10 08:58:21
【问题描述】:

我目前正在开发一个网络服务器,它将创建其他服务器的快速诊断仪表板。

我的要求是显示这些远程服务器的时间,似乎 NTP 造成了一些问题,我想看看。

我目前在我的桌面上有一个 bat 文件,可以简单地发送

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

我也试过了:

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

=> 结果为“0”

但我想在 PHP 中找到更好的解决方案,以便团队中的任何人都可以在网页上阅读它。

知道我会做什么吗?

注意:这与How to get date and time from server 广告无关,我想获取远程服务器而不是本地服务器的时间

【问题讨论】:

  • @Veve 这个是来自远程服务器的时间。
  • 您的网络服务器使用哪个操作系统?
  • @dognose 我的错,投票撤回。
  • @waza_be : 找到thisget_headers 的网页,以防远程服务器暴露一个。

标签: php time server


【解决方案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";
}

【讨论】:

【解决方案2】:

您可以将 powershell 脚本与 WMI 一起使用(假设您的服务器是 windows 机器)

这将比旧的 net time 样式快得多。

脚本需要使用域管理员(或任何其他具有 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

当您的用户访问“仪表板”时,加载这些偏移量并显示网络服务器当前时间 +/- 每台服务器的偏移量。 (可能会“过时”几微秒,但你在乎吗?)

【讨论】:

    【解决方案3】:

    为什么这么复杂?

    刚刚发现这是可行的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 2017-10-23
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多