PHP および NTP プロトコルを介してネットワーク時刻同期通信を実現する方法

王林
リリース: 2023-07-29 06:14:01
オリジナル
1175 人が閲覧しました

PHP および NTP プロトコルを介してネットワーク時刻同期通信を実現する方法

概要:
ネットワーク タイム プロトコル (略して NTP) は、コンピュータ システム時刻を同期するために使用されるプロトコルです。ネットワーク アプリケーションでは、ネットワーク サービスの正常な動作を保証するために、正確な時刻同期が非常に重要です。 PHP では、NTP プロトコルと通信することでネットワーク時刻の同期を実現できます。この記事では、PHP コードを使用して NTP サーバーと通信し、正確なネットワーク時刻を取得する方法を紹介します。

手順:

  1. ソケットを使用して 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 サーバーとの接続を確立するためのタイムアウトを定義します。

  1. Send NTP request packet
$request = "".str_repeat("", 47); // NTP请求包
socket_send($socket, $request, strlen($request), 0);
ログイン後にコピー

NTP 要求の最初のバイトはプロトコルのバージョンとモードです。 「 」は、クライアントがサーバーの時刻を取得したいことを示します。次の 47 バイトは 0 に設定されます。

  1. NTP 応答パケットの受信
if (socket_recv($socket, $response, 48, MSG_WAITALL) === FALSE) {
    // 处理接收超时的情况
    die("无法接收到响应包");
}
ログイン後にコピー

socket_recv 関数を使用して、NTP 応答パケットを受信します。 MSG_WAITALL パラメータは一度に 48 バイトのデータを受信することを保証しており、受信がタイムアウトした場合は FALSE が返されます。

  1. NTP 応答パケットの解析
$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 関数を使用して、タイムスタンプを読み取り可能な時刻にフォーマットします。

  1. NTP サーバーとの接続を閉じる
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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!