Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk mencapai komunikasi penyegerakan masa rangkaian melalui protokol PHP dan NTP

Bagaimana untuk mencapai komunikasi penyegerakan masa rangkaian melalui protokol PHP dan NTP

王林
王林asal
2023-07-28 22:09:191314semak imbas

Cara mencapai komunikasi penyegerakan masa rangkaian melalui protokol PHP dan NTP

Ikhtisar:
Protokol Masa Rangkaian (NTP) ialah protokol yang digunakan untuk menyegerakkan masa sistem komputer. Dalam aplikasi rangkaian, penyegerakan masa yang tepat adalah sangat penting untuk memastikan operasi normal perkhidmatan rangkaian. Dalam PHP, penyegerakan masa rangkaian boleh dicapai dengan berkomunikasi dengan protokol NTP. Artikel ini akan memperkenalkan cara menggunakan kod PHP untuk berkomunikasi dengan pelayan NTP untuk mendapatkan masa rangkaian yang tepat.

Langkah:

  1. Gunakan soket untuk mewujudkan sambungan dengan pelayan 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);

Di sini, kami menggunakan fungsi socket_create untuk mencipta soket UDP dan mewujudkan sambungan dengan pelayan NTP. Pembolehubah $ntpServer menyimpan alamat pelayan NTP, pembolehubah $ntpPort menentukan nombor port NTP (lalai ialah 123), dan pembolehubah $timeout mentakrifkan tamat masa untuk mewujudkan sambungan dengan pelayan NTP.

  1. Hantar paket permintaan NTP
$request = "".str_repeat("", 47); // NTP请求包
socket_send($socket, $request, strlen($request), 0);

Dalam permintaan NTP, bait pertama ialah versi dan mod protokol. ' ' menunjukkan bahawa pelanggan ingin mendapatkan masa pelayan. 47 bait seterusnya ditetapkan kepada 0.

  1. Terima paket respons NTP
if (socket_recv($socket, $response, 48, MSG_WAITALL) === FALSE) {
    // 处理接收超时的情况
    die("无法接收到响应包");
}

Gunakan fungsi socket_recv untuk menerima paket respons NTP. Parameter MSG_WAITALL menjamin bahawa 48 bait data diterima pada satu masa Jika masa penerimaan tamat, FALSE akan dikembalikan.

  1. Parse NTP response packet
$unpacked = unpack("N12", $response);
$timestamp = ($unpacked[9] - 2208988800); // 将NTP时间戳转换为Unix时间戳
$time = date("Y-m-d H:i:s", $timestamp); // 格式化时间

Gunakan fungsi unpack untuk menghuraikan data binari 48-bait kepada 12 integer 32-bit. Cap waktu NTP ialah integer 32-bit bermula dari 1 Januari 1900, manakala cap waktu Unix ialah integer 32-bit bermula dari 1 Januari 1970. Anda boleh menukar cap waktu NTP kepada cap masa Unix dengan menolak 2208988800. Akhir sekali, gunakan fungsi tarikh untuk memformat cap masa menjadi masa yang boleh dibaca.

  1. Tutup sambungan dengan pelayan NTP
socket_close($socket);

Selepas melengkapkan penyegerakan masa NTP, gunakan fungsi socket_close untuk menutup sambungan dengan pelayan NTP.

Kod sampel:

$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;

Kod sampel di atas mencapai penyegerakan masa rangkaian melalui protokol PHP dan NTP. Anda boleh membenamkan kod di atas ke dalam aplikasi PHP anda untuk memastikan ketepatan masa perkhidmatan rangkaian.

Atas ialah kandungan terperinci Bagaimana untuk mencapai komunikasi penyegerakan masa rangkaian melalui protokol PHP dan NTP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn