Comment réaliser une communication de synchronisation de l'heure du réseau via les protocoles PHP et NTP
Présentation :
Network Time Protocol (NTP en abrégé) est un protocole utilisé pour synchroniser l'heure du système informatique. Dans les applications réseau, une synchronisation horaire précise est très importante pour garantir le fonctionnement normal des services réseau. En PHP, la synchronisation de l'heure du réseau peut être réalisée en communiquant avec le protocole NTP. Cet article explique comment utiliser le code PHP pour communiquer avec un serveur NTP afin d'obtenir une heure réseau précise.
Étapes :
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $ntpServer = "time.google.com"; $ntpPort = 123; $timeout = 5; socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); socket_connect($socket, $ntpServer, $ntpPort);
Ici, nous utilisons la fonction socket_create pour créer un socket UDP et établir une connexion avec le serveur NTP. La variable $ntpServer stocke l'adresse du serveur NTP, la variable $ntpPort spécifie le numéro de port NTP (la valeur par défaut est 123) et la variable $timeout définit le délai d'attente pour établir une connexion avec le serveur NTP.
$request = "".str_repeat("", 47); // NTP请求包 socket_send($socket, $request, strlen($request), 0);
Dans la requête NTP, le premier octet est la version et le mode du protocole. ' ' indique que le client souhaite obtenir l'heure du serveur. Les 47 octets suivants sont mis à 0.
if (socket_recv($socket, $response, 48, MSG_WAITALL) === FALSE) { // 处理接收超时的情况 die("无法接收到响应包"); }
Utilisez la fonction socket_recv pour recevoir le paquet de réponse NTP. Le paramètre MSG_WAITALL garantit que 48 octets de données sont reçus en même temps. Si le délai de réception expire, FALSE sera renvoyé.
$unpacked = unpack("N12", $response); $timestamp = ($unpacked[9] - 2208988800); // 将NTP时间戳转换为Unix时间戳 $time = date("Y-m-d H:i:s", $timestamp); // 格式化时间
Utilisez la fonction de décompression pour analyser les données binaires de 48 octets en 12 entiers de 32 bits. L'horodatage NTP est un entier de 32 bits commençant le 1er janvier 1900, tandis que l'horodatage Unix est un entier de 32 bits commençant le 1er janvier 1970. Vous pouvez convertir l'horodatage NTP en horodatage Unix en soustrayant 2208988800. Enfin, utilisez la fonction date pour formater l'horodatage en une heure lisible.
socket_close($socket);
Après avoir terminé la synchronisation de l'heure NTP, utilisez la fonction socket_close pour fermer la connexion avec le serveur NTP.
Exemple de code :
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $ntpServer = "time.google.com"; $ntpPort = 123; $timeout = 5; socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0)); socket_connect($socket, $ntpServer, $ntpPort); $request = "".str_repeat("", 47); // NTP请求包 socket_send($socket, $request, strlen($request), 0); if (socket_recv($socket, $response, 48, MSG_WAITALL) === FALSE) { // 处理接收超时的情况 die("无法接收到响应包"); } $unpacked = unpack("N12", $response); $timestamp = ($unpacked[9] - 2208988800); // 将NTP时间戳转换为Unix时间戳 $time = date("Y-m-d H:i:s", $timestamp); // 格式化时间 socket_close($socket); echo "同步时间为:".$time;
L'exemple de code ci-dessus permet la synchronisation de l'heure du réseau via les protocoles PHP et NTP. Vous pouvez intégrer le code ci-dessus dans votre application PHP pour garantir la précision temporelle du service réseau.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!