PHP および NTP プロトコルを介してネットワーク時刻同期通信を実現する方法
概要:
ネットワーク タイム プロトコル (略して NTP) は、コンピュータ システム時刻を同期するために使用されるプロトコルです。ネットワーク アプリケーションでは、ネットワーク サービスの正常な動作を保証するために、正確な時刻同期が非常に重要です。 PHP では、NTP プロトコルと通信することでネットワーク時刻の同期を実現できます。この記事では、PHP コードを使用して 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);
ここでは、socket_create 関数を使用して UDP ソケットを作成し、 NTPサーバーへの接続を確立します。 $ntpServer 変数は NTP サーバーのアドレスを格納し、$ntpPort 変数は NTP ポート番号 (デフォルトは 123) を指定し、$timeout 変数は NTP サーバーとの接続を確立するためのタイムアウトを定義します。
$request = "".str_repeat("", 47); // NTP请求包 socket_send($socket, $request, strlen($request), 0);
NTP 要求の最初のバイトはプロトコルのバージョンとモードです。 「 」は、クライアントがサーバーの時刻を取得したいことを示します。次の 47 バイトは 0 に設定されます。
if (socket_recv($socket, $response, 48, MSG_WAITALL) === FALSE) { // 处理接收超时的情况 die("无法接收到响应包"); }
socket_recv 関数を使用して、NTP 応答パケットを受信します。 MSG_WAITALL パラメータは一度に 48 バイトのデータを受信することを保証しており、受信がタイムアウトした場合は FALSE が返されます。
$unpacked = unpack("N12", $response); $timestamp = ($unpacked[9] - 2208988800); // 将NTP时间戳转换为Unix时间戳 $time = date("Y-m-d H:i:s", $timestamp); // 格式化时间
unpack 関数を使用して、48 バイトのバイナリ データを 12 個の 32 ビット整数に解析します。 NTP タイムスタンプは 1900 年 1 月 1 日から始まる 32 ビット整数ですが、Unix タイムスタンプは 1970 年 1 月 1 日から始まる 32 ビット整数です。 2208988800 を減算すると、NTP タイムスタンプを Unix タイムスタンプに変換できます。最後に、date 関数を使用して、タイムスタンプを読み取り可能な時刻にフォーマットします。
socket_close($socket);
NTP 時刻同期が完了したら、socket_close 関数を使用して 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); $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;
上記のサンプル コードは、PHP および NTP プロトコルを通じてネットワーク時刻の同期を実現します。上記のコードを PHP アプリケーションに埋め込むと、ネットワーク サービスの時間精度を確保できます。
以上がPHP および NTP プロトコルを介してネットワーク時刻同期通信を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。