현재 위치: > 최신 기사 목록> 보다 정확한 지연 제어를 달성하기 위해 Microtime과 함께 PHP의 Time_NanoSleep 기능을 사용하는 방법은 무엇입니까?

보다 정확한 지연 제어를 달성하기 위해 Microtime과 함께 PHP의 Time_NanoSleep 기능을 사용하는 방법은 무엇입니까?

gitbox 2025-05-20

고정밀 작업 또는 시간에 민감한 PHP 응용 프로그램에서 일반 수면 () 또는 usleep ()는 종종 나노초 지연 제어 요구 사항을 충족하지 못합니다. 수면 ()은 몇 초에서만 정확할 수 있습니다. USLEEP ()는 마이크로 초를 지원하지만 PHP의 자체 스케줄링 메커니즘 및 시스템 정확도 제한으로 인해 안정적인 고정밀 제어를 달성하는 것은 여전히 ​​불가능합니다.

이 문제를 해결하기 위해 Time_nanoSleep () 함수는보다 세련된 지연 제어 방법을 제공합니다. 이 기사는 정확한 지연 제어를 달성하기 위해 마이크로 타임 (True)Time_nanosleep ()를 결합하는 방법을 소개합니다.

Time_nanosleep을 사용하는 이유는 무엇입니까?

time_nanosleep () 는 나노 초 수준 지연에 대해 PHP가 제공하는 함수입니다. 기능 프로토 타입은 다음과 같습니다.

 bool time_nanosleep(int $seconds, int $nanoseconds)

스크립트 실행을 일시 중지하기 위해 "Seconds"와 "Nanoseconds"의 조합을 지정할 수 있습니다. 예를 들어, 1.5 밀리 초 (즉, 1500000 나노초) 씩 지연하려면 다음 방법을 사용할 수 있습니다.

 time_nanosleep(0, 1500000);

참고 : time_nanoSleep () 의 동작은 여전히 ​​시스템 클록 정확도와 PHP 구현의 영향을받으며 진정한 정확도는 약간 편향 될 수 있습니다. 그러나 대부분의 응용 분야에서는 usleep () 보다 안정적입니다.

마이크로 타임으로 지연 시간의 정확한 제어

때때로 우리는 고정 시간을 지연시킬 필요가있을뿐만 아니라 특정 지점에서 특정 지점의 끝까지 일정 기간 내에 코드가 정확하게 제어되도록하고자합니다. 현재 마이크로 타임 (True) 은 매우 유용하며, Unix Epoch 이후에 마이크로 초 타임 스탬프를 반환하고 정확도가 높습니다.

다음은 time_nanosleep ()마이크로 타임 (True) 조합을 사용하여 구현 된 지연 제어의 예입니다.

 <?php

// 대상 지연 시간(몇 초 만에)
$targetDelay = 0.005; // 5 밀리 초

$start = microtime(true);

// 특정 작업 수행 시뮬레이션
for ($i = 0; $i < 1000; $i++) {
    // 이주기가 시간을 소비한다고 가정합니다
}

// 소비 시간을 계산하십시오
$elapsed = microtime(true) - $start;

// 추가 지연에 필요한 시간
$remainingDelay = $targetDelay - $elapsed;

if ($remainingDelay > 0) {
    // 나머지 시간을 초와 나노초로 나눕니다
    $seconds = (int)$remainingDelay;
    $nanoseconds = (int)(($remainingDelay - $seconds) * 1e9);

    // 정확한 지연
    time_nanosleep($seconds, $nanoseconds);
}

// 총 시간 소모 점검
$totalTime = microtime(true) - $start;
echo "총 시간 소비: " . round($totalTime * 1000, 3) . " 밀리 초\n";

일반적인 응용 프로그램 시나리오

  • 실시간 획득 시스템의 샘플링 간격 제어

  • 속도 제한 다운로드/업로드 기능 (예 : 특정 URL에 대한 액세스 빈도 제한)

  • 특정 인터페이스 응답 동작을 테스트 할 때 네트워크 지연 시뮬레이션

예를 들어, 속도 제한 API 요청자를 구현할 때 :

 <?php

$urls = [
    "https://gitbox.net/api/data/1",
    "https://gitbox.net/api/data/2",
    "https://gitbox.net/api/data/3"
];

$interval = 0.2; // 모든 200 밀리 초请求一次

foreach ($urls as $url) {
    $start = microtime(true);

    // 시뮬레이션 요청
    file_get_contents($url);

    $elapsed = microtime(true) - $start;
    $remaining = $interval - $elapsed;

    if ($remaining > 0) {
        time_nanosleep(0, (int)($remaining * 1e9));
    }
}

이러한 방식으로, 각 요청 간의 간격을보다 정확하게 제어하거나 대상 서버에 압력을 가하지 않거나 자체 애플리케이션의 리듬 요구를 충족시킬 수 있습니다.

주목해야 할 것

  • Time_nanosleep ()는 실시간 운영 체제에서 "하드 실시간"이 아니며 100% 정확도를 보장 할 수는 없지만 비 임계적인 경우에는 사용하기에 충분합니다.

  • 일부 플랫폼 또는 PHP 컴파일 버전은 Time_NanoSleep ()를 지원하지 않을 수 있습니다. 사용하기 전에 기능을 사용할 수 있는지 확인하는 것이 좋습니다.

  • 보다 안정적인 타이밍 정확도가 필요한 경우 다른 언어 (예 : C) 또는 시스템 수준 지원을 고려해야 할 수도 있습니다.

요약

Microtime (True) 과 함께 Time_nanosleep ()를 사용하면 PHP에서 USLEEP () 보다 더 정확한 지연 제어를 달성 할 수 있으며, 이는 시간 제어에 대한 요구 사항이 높은 시나리오에 적합합니다. 시스템 스케줄링 및 PHP 구현 세부 사항에 의해 여전히 제한되어 있지만 대부분의 응용 프로그램에서 충분한 정밀도와 유연성을 제공하며 정제 된 대기 시간 제어를위한 중요한 도구입니다.