>  기사  >  백엔드 개발  >  PHP 및 NTP 프로토콜을 통해 네트워크 시간 동기화 통신을 달성하는 방법

PHP 및 NTP 프로토콜을 통해 네트워크 시간 동기화 통신을 달성하는 방법

王林
王林원래의
2023-07-28 22:09:191213검색

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

여기에서는 소켓_create 함수를 사용하여 UDP 소켓을 만들고 NTP 서버와 연결을 설정합니다. $ntpServer 변수는 NTP 서버의 주소를 저장하고, $ntpPort 변수는 NTP 포트 번호(기본값은 123)를 지정하며, $timeout 변수는 NTP 서버와의 연결 설정에 대한 시간 제한을 정의합니다.

  1. NTP 요청 패킷 보내기
$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); // 格式化时间

압축 풀기 기능을 사용하여 48바이트 바이너리 데이터를 12개의 32비트 정수로 구문 분석합니다. NTP 타임스탬프는 1900년 1월 1일부터 시작하는 32비트 정수인 반면, Unix 타임스탬프는 1970년 1월 1일부터 시작하는 32비트 정수입니다. 2208988800을 빼면 NTP 타임스탬프를 Unix 타임스탬프로 변환할 수 있습니다. 마지막으로 날짜 함수를 사용하여 타임스탬프를 읽을 수 있는 시간으로 형식화합니다.

  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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.