2017-02-10 3 views
1

В настоящее время я работаю над websever, который создаст оперативную диагностическую панель других серверов.Как я могу получить время удаленного сервера?

Мое требование - отображать время этих удаленных серверов, кажется, что NTP создает некоторые проблемы, и я хотел бы это увидеть.

В настоящее время я летучая мышь файл на моем рабочем столе, который просто отправить

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 -and-time-from-server) – Veve

+1

@ Покажите это время с сервера REMOTE. – dognose

+0

Какая операционная система использует ваш веб-сервер? – dognose

ответ

1

Вы можете использовать протокол NTP для получения DateTime с удаленного сервера.

Попробуйте этот код:

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-сервер, что обычно не является истинным в локальном домене. – 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

Вы можете использовать Powershell сценарий вместе с WMI (предполагается, что серверы являются окна машины)

Это будет намного быстрее, чем старый 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)

Когда ваши пользователи посещают «приборную панель», загружают эти смещения и отображают текущее время веб-серверов +/- смещение на сервер. (Может быть «устаревшим» на некоторые микросекунды тогда, но вам все равно?)

0

Почему так сложно?

Просто обнаружил, что это работает:

echo exec('net time \\\\SRV****, $output); 
echo '<pre>'; 
print_r($output); 
echo '</pre>'; 
Смежные вопросы