현재 위치: > 최신 기사 목록> Sub-Second 일시 정지를 달성하기 위해 PHP에서 Time_nanosleep 사용 방법

Sub-Second 일시 정지를 달성하기 위해 PHP에서 Time_nanosleep 사용 방법

gitbox 2025-05-26

고성능 또는 시간에 민감한 PHP 응용 프로그램을 작성할 때는 때때로 밀리 초 또는 미세한 마이크로 초 또는 나노초 수준과 같이 매우 짧은 시간 동안 실행을 일시 중지하는 프로그램이 필요합니다. 이 요구 사항은 정밀 타이밍 제어, 스로틀 요청 또는 하드웨어와 상호 작용할 때 특히 중요합니다. 다행히도 PHP는 내장 기능 Time_nanosleep () 를 제공하여 나노초에 정확한 일시 중지를 가능하게합니다. 이 기사는이 기능의 사용법과 예방 조치에 대한 깊은 이해를 안내하며, 유연하게 마스터하는 데 도움이되는 여러 가지 실용적인 예를 제공합니다.

1. Time_nanoSleep 란 ​​무엇입니까?

time_nanosleep () 는 PHP의 함수로 초과 몇 초와 나노초를 지정하기 위해 프로그램을 일시 중지합니다. 함수 서명은 다음과 같습니다.

 bool time_nanosleep ( int $seconds , int $nanoseconds )
  • $ 초 : 정수, 일시 중지 할 초의 수를 나타냅니다.

  • $ Nanoseconds : 정수, 일시 중지 할 나노초의 수를 나타냅니다 (0 ~ 999999999).

이 함수는 1 초 미만의 시간을 일시 중지하는 데 사용될 수 있으므로 서브 초 수준 지연을 달성 할 수 있습니다.

2. 왜 수면이나 잠들지 않고 Time_nanoSleep을 사용합니까?

PHP는 또한 일반적으로 사용되는 일시 정지 기능의 두 가지를 가지고 있습니다 : sleep ()usleep () . 그들 사이의 차이점은 다음과 같습니다.

  • 수면 (int $ 초) : 몇 초에서만 정확합니다.

  • usleep (int $ microseconds) : 마이크로 초에 정확합니다 (백만 분의 1 초).

  • time_nanosleep (int $ 초, int $ nanoseconds) : 나노 초 (1 억 1 억 분)에 정확하게 지원합니다.

따라서 Time_NanoSleep ()는 정밀 시간 제어가 더 높은 경우 더 나은 선택입니다.

3. 기본 사용 예제

다음은 0.5 초 동안 일시 중지하는 간단한 예입니다 (예 : 500 밀리 초).

 <?php
echo "Start: " . microtime(true) . PHP_EOL;
time_nanosleep(0, 500000000); // 정지시키다 0.5 두번째
echo "End: " . microtime(true) . PHP_EOL;
?>

출력은 다음과 같습니다.

 Start: 1716026901.12345
End: 1716026901.62346

보시다시피, 프로그램은 약 0.5 초 동안 일시 중지되었습니다.

4. 정확한 지연 루프를 달성하십시오

200 밀리 초마다 특정 코드를 실행하려고한다고 가정하면 다음 방법을 사용할 수 있습니다.

 <?php
for ($i = 0; $i < 5; $i++) {
    echo "Tick $i at " . microtime(true) . PHP_EOL;
    time_nanosleep(0, 200000000); // 200 毫두번째
}
?>

이 작문 방법은 스로틀 요청 보내기, 타이밍 출력 로그, 폴링 센서 등과 같은 시나리오에서 효과적으로 사용할 수 있습니다.

5. 인터럽트 핸들 : 시도 캐치를 사용하여 예외를 포착하십시오

Time_NanoSleep ()는 일부 시스템에서 신호 중단 (예 : POSIX 신호)으로 인해 미리 돌아올 수 있으며 False를 반환 할 수 있습니다. 이 경우 루프 재 시도 메커니즘을 사용할 수 있습니다.

 <?php
$seconds = 0;
$nanoseconds = 250000000; // 250 毫두번째

do {
    $result = time_nanosleep($seconds, $nanoseconds);
} while ($result === false && ($error = error_get_last()) && strpos($error['message'], 'interrupted') !== false);
?>

대부분의 일반적인 응용 프로그램은 이러한 인터럽트에 직면하지 않지만 이러한 유형의 보호는 다중 스레드 또는 동시성 환경에서 권장됩니다.

6. 실제 응용 시나리오와 결합

1 밀리 초마다 데이터 인터페이스를 폴링하는 데 필요한 하드웨어 장치 용 API를 개발한다고 가정하면 다음과 같이 쓸 수 있습니다.

 <?php
$url = 'https://gitbox.net/api/device/status';

for ($i = 0; $i < 1000; $i++) {
    $response = file_get_contents($url);
    echo "[$i] Response: $response" . PHP_EOL;
    time_nanosleep(0, 1000000); // 1 毫두번째
}
?>

이 작문 방법은 CPU 직업 폭발을 일으키지 않고 고주파수 데이터 풀을 수행 할 수 있습니다.

7. 호환성 및 제한

  • Time_nanoSleep ()는 PHP 5 이후로 사용할 수 있으며 거의 ​​모든 주류 버전으로 제공됩니다.

  • Windows와 Unix와 같은 시스템에서 실행될 수 있습니다.

  • 나노초 들어가는 것을 지원하지만 정확도는 실제로 시스템 클록 해상도에 따라 다릅니다. 일부 플랫폼에서는 최소 정확도가 여전히 마이크로 초에있을 수 있습니다.

요약

Time_nanoSleep () 는 PHP에서 강력하지만 종종 간과되는 기능입니다. 개발자에게 프로그램 시간을 미묘하게 제어 할 수있는 기능을 제공합니다. 이 튜토리얼의 설명과 예를 통해 응용 프로그램의 제어 및 성능을 향상시키기 위해 유연하게 적용하는 방법을 마스터 할 수 있어야합니다. 인터럽트 처리 및 시스템 제한에주의를 기울이는 한 Time_NanoSleep ()는 다양한 시나리오에서 안전하고 정확하게 사용할 수 있습니다.