현재 위치: > 최신 기사 목록> gettimeofday 정확도가 손실되면 어떻게해야합니까? PHP에서 마이크로 초 부정확성 문제를 해결하는 방법은 무엇입니까?

gettimeofday 정확도가 손실되면 어떻게해야합니까? PHP에서 마이크로 초 부정확성 문제를 해결하는 방법은 무엇입니까?

gitbox 2025-05-26

PHP에서 현재 시간의 마이크로 초 부분을 얻는 것은 일반적으로 gettimeofday () 함수를 사용하는 데 사용됩니다. 이 기능은 현재 시간의 초와 마이크로 초를 반환 할 수 있으며 정확도는 매우 높아야합니다. 그러나 실제로 사용하면 많은 개발자들은 마이크로 초 부분의 정확성이 예상대로 아님을 발견했으며, 손실 또는 부정확성이있어 특히 성능이 매우 높거나 타임 스탬프 요구 사항이있는 시나리오에서 부정확 한 시간 관련 계산이 발생합니다.

이 기사는 gettimeofday () 정확도 상실의 이유를 심도있게 분석하고 PHP의 마이크로 초 부정확성 문제를 해결하기위한 몇 가지 효과적인 솔루션을 제공합니다.


1. gettimeofday 기능 및 정확도 문제

gettimeofday () 두 개의 주요 필드가 포함 된 배열을 반환합니다.

  • SEC : UNIX 시대 이후 몇 초

  • USEC : 현재 두 번째의 마이크로 초 수

정상적인 상황에서 USEC는 1 초 1 초에 정확해야하지만 일부 시스템 또는 PHP 버전에서는 USEC 가 완전히 신뢰할 수 없으며 정확도가 낮거나 0이 낮을 수 있습니다.

 <?php
$time = gettimeofday();
echo "Seconds: " . $time['sec'] . "\n";
echo "Microseconds: " . $time['usec'] . "\n";
?>

테스트에서 USEC가 항상 0이거나 변경이 매우 작다는 것을 알게되면 시스템 호출 레벨 문제 또는 PHP 바인딩 기능 자체의 한계 일 수 있습니다.


2. PHP에서 더 높은 정밀도로 현재 시간을 얻는 방법

1. 소액 타임 사용 (True)

마이크로 타임 () 은 PHP에서보다 일반적으로 사용되는 기능으로 마이크로 초 타임 스탬프를 얻습니다. 마이크로 타임 (True)을 호출하면 10 진수 초가 마이크로 초의 타임 스탬프를 반환합니다.

 <?php
$microtime = microtime(true);
echo "Current time with microseconds: " . $microtime . "\n";
?>

마이크로 타임 (True)은 부동 소수점 형식을 반환하며, 초 지점 + 소수점 후 마이크로 초로 반환되며 정확도는 일반적으로 더 안정적입니다. gettimeofday () 대신 이것을 사용하는 것이 좋습니다.


2. hrtime ()을 사용하여 나노 초 레벨 시간을 달성하십시오

PHP 7.3 이상 버전은 시간 측정 정확도에 대한 요구 사항이 매우 높은 시나리오에 적합한 나노 초 시간을 반환하는 고정밀 타이머 인 HRTIME ()를 지원합니다.

 <?php
// 현재 시간의 나노 초 수를 반환합니다
$nanoseconds = hrtime(true);
echo "High resolution time in nanoseconds: " . $nanoseconds . "\n";

// 나노초를 초로 변환하십시오 + 마이크로 초
$seconds = floor($nanoseconds / 1e9);
$microseconds = floor(($nanoseconds % 1e9) / 1e3);
echo "Seconds: $seconds, Microseconds: $microseconds\n";
?>

HRTIME ()는 시스템 시간을 나타내지 않고 성능 테스트 및 기타 요구에 적합한 고정밀 타이머를 나타냅니다.


3. 마이크로 초 시간 형식을 사용자 정의하십시오

출력을 시간 내내 포맷해야하고 마이크로 초가 정확한 경우 DateTimeDateTimeImutable을 결합하여 처리 할 수 ​​있습니다.

 <?php
$date = DateTime::createFromFormat('U.u', microtime(true));
echo $date->format("Y-m-d H:i:s.u") . "\n";
?>

이것은 정확한 형식과 읽을 수있는 마이크로 초를 포함하는 시간 문자열을 출력합니다.


3. 요약

  • gettimeofday ()는 일부 환경에서 마이크로 초 정확도가 충분하지 않으며 고정밀 시간 측정에 의존하는 것이 좋습니다.

  • 마이크로 타임 (true)을 사용하여 간단하고 편리하며 호환성이 우수한 마이크로 초의 타임 스탬프를 얻으십시오.

  • 더 높은 정밀 타이밍이 필요한 경우, 나노초 수준 타이밍을 지원하는 PHP 7.3+ hrtime ()을 사용하는 것이 좋습니다.

  • 마이크로 타임 (True) 과 결합 된 DateTime 객체는 마이크로 초과 함께 출력 형식 시간을 쉽게 달성 할 수 있습니다.

이러한 방법은 PHP에서 마이크로 초 부정확성의 문제를 해결하기 위해 조합하여 사용될 수 있으며 응용 프로그램의 시간 정확도 요구가 충족되도록 할 수 있습니다.


 <?php
// 예:사용 microtime(true) 현재 시간을 가져 와서 출력을 형식화하십시오
$microtime = microtime(true);
$date = DateTime::createFromFormat('U.u', $microtime);
echo "当前时间带마이크로 초:" . $date->format("Y-m-d H:i:s.u") . "\n";

// 사용 hrtime() 고정밀 시간을 얻으십시오
$nanoseconds = hrtime(true);
$seconds = floor($nanoseconds / 1e9);
$microseconds = floor(($nanoseconds % 1e9) / 1e3);
echo "고정밀 타이머 - 두번째: $seconds, 마이크로 초: $microseconds\n";

// 참조 문서 주소:https://gitbox.net/php/manual/en/function.microtime.php
?>