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:
$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.
$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.
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.
$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.
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!