고정밀 작업 또는 시간에 민감한 PHP 응용 프로그램에서 일반 수면 () 또는 usleep ()는 종종 나노초 지연 제어 요구 사항을 충족하지 못합니다. 수면 ()은 몇 초에서만 정확할 수 있습니다. USLEEP ()는 마이크로 초를 지원하지만 PHP의 자체 스케줄링 메커니즘 및 시스템 정확도 제한으로 인해 안정적인 고정밀 제어를 달성하는 것은 여전히 불가능합니다.
이 문제를 해결하기 위해 Time_nanoSleep () 함수는보다 세련된 지연 제어 방법을 제공합니다. 이 기사는 정확한 지연 제어를 달성하기 위해 마이크로 타임 (True) 과 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 구현 세부 사항에 의해 여전히 제한되어 있지만 대부분의 응용 프로그램에서 충분한 정밀도와 유연성을 제공하며 정제 된 대기 시간 제어를위한 중요한 도구입니다.