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

王林
Libérer: 2023-07-29 06:14:01
original
1295 Les gens l'ont consulté

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);
Copier après la connexion

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);
Copier après la connexion

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("无法接收到响应包");
}
Copier après la connexion

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); // 格式化时间
Copier après la connexion

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);
Copier après la connexion

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;
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal