Maison >développement back-end >tutoriel php >Comment réaliser une communication de synchronisation de l'heure du réseau via les protocoles PHP et NTP

Comment réaliser une communication de synchronisation de l'heure du réseau via les protocoles PHP et NTP

王林
王林original
2023-07-28 22:09:191257parcourir

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 :

  1. Utilisez socket pour établir une connexion avec le serveur NTP
$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.

  1. Envoyer le paquet de requête 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.

  1. Recevoir le paquet de réponse NTP
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é.

  1. Analyser le paquet de réponse NTP
$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.

  1. Fermez la connexion avec le serveur NTP
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn