Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何获取远程服务器的时间?_Php_Time_Server - Fatal编程技术网

Php 如何获取远程服务器的时间?

Php 如何获取远程服务器的时间?,php,time,server,Php,Time,Server,我目前正在开发一个websever,它将创建一个其他服务器的快速诊断仪表板 我的要求是显示这些远程服务器的时间,似乎NTP产生了一些问题,我希望看到这一点 目前我的桌面上有一个bat文件,只需发送 net time \\SRV******* 我也尝试过: echo exec('net time \\\\SRV****'); =>结果为“0” 但我想在PHP中找到更好的解决方案,这样团队中的任何人都可以在网页上阅读 你知道我会怎么做吗 注意:这与ad无关。我想获取远程服务器的时间,而不是本地服

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

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

目前我的桌面上有一个bat文件,只需发送

net time \\SRV*******
我也尝试过:

echo exec('net time \\\\SRV****');
=>结果为“0”

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

你知道我会怎么做吗


注意:这与ad无关。我想获取远程服务器的时间,而不是本地服务器的时间。您可以使用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";
}
错误报告(E\u所有^E\u通知);
ini设置(“显示错误”,1);
日期默认时区设置(“欧洲/…);
函数查询\u时间\u服务器($timeserver,$socket)
{
$fp=fsockopen($timeserver,$socket,$err,$errstr,5);
#参数:服务器、套接字、错误代码、错误文本、超时
如果($fp){
FPUT($fp,“\n”);
$timevalue=fread($fp,49);
fclose($fp)#关闭连接
}否则{
$timevalue=“”;
}
$ret=array();
$ret[]=$timevalue;
$ret[]=$err;#错误代码
$ret[]=$errstr;#错误文本
回报($ret);
}
$timeserver=“10.10.10.10”#服务器IP或主机
$timercvd=查询时间服务器($timeserver,37);
//如果查询\u时间\u服务器没有错误
如果(!$timercvd[1]){
$timevalue=bin2hex($timercvd[0]);
$timevalue=abs(HexDec('7fffffff')-HexDec($timevalue)-HexDec('7fffffff'));
$tmestamp=$timevalue-220898880;#转换为UNIX历元时间戳
$datum=日期(“Y-m-d(d)H:i:s”、$tmestamp-日期(“Z”、$tmestamp));/*包括时区偏移*/
$doy=(日期(“z”,$tmestamp)+1);
回显“来自时间服务器的时间检查,$timeserver,”:[“,$timevalue,”];
echo”(自1900-01-01 00:00.00起的秒数)。
\n; echo“当前日期和世界时为”、$datum、“UTC。”; 回音“这是今年的一天,$doy”。
\n; echo“unix历元时间戳为$tmestamp.
\n”; 回音日期(“d/m/Y H:i:s”,$tmestamp); }否则{ echo“很遗憾,此时无法访问时间服务器$timeserver。”; 回显“$timercvd[1]$timercvd[2]。
\n”; }
您可以将powershell脚本与WMI一起使用(假设您的服务器是windows计算机)

这将比旧的
净时间
样式快得多

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

您可以通过每5分钟安排一次任务来实现这一点

如果您希望以“秒/分钟”显示时间(我不会经常查询每个服务器,因为时间变化不那么快),您可以添加一些数学:

执行脚本时,不要存储实际时间,而只存储与Web服务器时间相比的每个服务器的偏移量。(即
+2.2112
-15.213

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

为什么这么复杂

刚刚发现这是可行的:

echo exec('net time \\\\SRV****, $output);
echo '<pre>';
print_r($output);
echo '</pre>'; 
echo exec('net time\\\\SRV****,$output);
回声';
打印(输出);
回声';

可能重复的@Veve这一个是来自远程服务器的时间。您的Web服务器使用的是哪个操作系统?@dognose my bad,vote retracted.@waza_be:使用网页的
get_headers
找到,以防远程服务器暴露一个。我认为只有当每个服务器都充当ntp服务器时,这才有效,这在本地域中通常不正确。服务器必须设置为充当NTP服务器-Windows配置、Linux(CentOS)配置-
echo exec('net time \\\\SRV****, $output);
echo '<pre>';
print_r($output);
echo '</pre>';