2017-02-10 35 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>'; 
相關問題