Comment puis-je obtenir l’heure d’un serveur distant?

Je travaille actuellement sur un navigateur Web qui créera un tableau de bord de diagnostic rapide des autres serveurs.

Mon exigence est d’afficher l’heure de ces serveurs distants, il semble que le NTP crée des problèmes et j’aimerais le voir.

J’ai actuellement un fichier de chauve-souris sur mon bureau qui envoie simplement

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

J’ai aussi essayé:

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

=> le résultat est ‘0’

Mais je voudrais trouver une meilleure solution en PHP pour que tout le monde puisse le lire sur une page Web.

Une idée de ce que je ferais?

Note: ceci n’est pas lié à Comment obtenir la date et l’heure de l’ annonce du serveur Je veux obtenir l’heure d’un serveur REMOTE et non du serveur local

Vous pouvez utiliser le protocole NTP pour récupérer des données depuis un serveur distant.

Essayez ce code:

 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("Ymd (D) H:i:s",$tmestamp - date("Z",$tmestamp)); /* incl time zone offset */ $doy = (date("z",$tmestamp)+1); echo "Time check from time server ",$timeserver," : [",$timevalue,"]"; echo " (seconds since 1900-01-01 00:00.00).
\n"; echo "The current date and universal time is ",$datum," UTC. "; echo "It is day ",$doy," of this year.
\n"; echo "The unix epoch time stamp is $tmestamp.
\n"; echo date("d/m/YH:i:s", $tmestamp); } else { echo "Unfortunately, the time server $timeserver could not be reached at this time. "; echo "$timercvd[1] $timercvd[2].
\n"; }

Vous pouvez utiliser un script powershell avec WMI (en supposant que vos serveurs sont des machines Windows)

Ce sera beaucoup plus rapide que l’ancien style de net time .

Le script doit être exécuté avec un Domain-Admin (ou tout autre utilisateur disposant des permissions de requête 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 } 

Vous pouvez réaliser cela avec une tâche planifiée toutes les 5 minutes.

Si vous voulez afficher l’heure “avec secondes / minutes” (je ne demanderais pas trop à chaque serveur, car le temps ne change pas si vite), vous pouvez append un peu de maths:

Lors de l’exécution du script, ne stockez pas l’heure réelle, mais uniquement le offset de chaque serveur, par rapport à l’heure de vos serveurs Web. (c.-à-d. +2.2112 , -15.213 )

Lorsque vos utilisateurs visitent le “tableau de bord”, chargez ces décalages et affichez l’heure actuelle des serveurs Web +/- le décalage par serveur. (Pourrait être “obsolète” par quelques microsecondes alors, mais vous en souciez-vous?)

Pourquoi si compliqué?

Juste trouvé que cela fonctionne:

 echo exec('net time \\\\SRV****, $output); echo '
'; print_r($output); echo '

';