PHP에서 Time_nanoSleep 은 고정밀 지연의 함수이며 기능 서명은 다음과 같습니다.
bool time_nanosleep(int $seconds, int $nanoseconds)
이 기능을 통해 개발자는 현재 프로세스를 일시 중지하여 초와 나노초를 지정하여 수면 보다 더 세분화 된 시간 제어를 달성 할 수 있습니다. 그러나 실제로 사용하면 두 번째 매개 변수 $ Nanoseconds 의 값이 1 초 미만 (즉, 1,000,000,000 나노초)이어야한다는 것을 알 수 있습니다. 그렇지 않으면 경고가 발생하고 기능 실행이 실패합니다. 이 제한의 근본은 실제로 기본 시스템 호출의 동작과 시간이 어떻게 표현되는지에서 비롯됩니다.
time_nanosleep은 운영 체제가 제공하는 nanosleep () 함수를 호출하여 PHP에서 구현됩니다. NanoSleep 은 POSIX 표준의 함수이며 매개 변수는 Timespec 구조입니다.
struct timespec {
time_t tv_sec; // 두번째
long tv_nsec; // 纳두번째 (0 ~ 999,999,999)
};
보시다시피, TV_NSEC 필드 정의는 값 범위가 0 ~ 999,999,999 (즉, 1 초 미만)임을 명확하게 규정합니다. 1,000,000,000보다 큰 값이 전달되면 운영 체제는이 값을 불법으로 간주하고 오류 코드 EinVal을 반환합니다 (매개 변수는 유효하지 않음).
PHP의 time_nanoSleep 은이 기본 기능에 직접적으로 의존하기 때문에 동일한 제약 조건을 따라야합니다.
PHP에서 $ nanoseconds = 1000000000 이상을 통과하려고하면 다음과 유사한 경고 메시지를 받게됩니다.
Warning: time_nanosleep(): nanosecond value out of range in ...
PHP 인터프리터는 시스템 기능을 호출하기 전에 매개 변수를 확인하고,이 바운드 외 동작을 미리 캡처하며, 기본 시스템이 프로세스에 불안정한 영향을 미치는 오류를보고하는 것을 방지합니다. 이 접근법은 코드의 견고성을 향상시킬 수 있지만 개발자는 들어오는 매개 변수가 유효한 범위 내에 있는지 수동으로 보장해야합니다.
1 초 이상의 고정밀 지연을 달성하려면 몇 초를 나노 초에 합리적으로 할당 할 수 있습니다. 예를 들어, 1.5 초 만에 지연하려면 다음을 작성할 수 있습니다.
time_nanosleep(1, 500000000); // 1 두번째 + 0.5 두번째
이 방법은 지연 요구 사항을 충족 할뿐만 아니라 나노 초 교차의 수를 피하는 두 매개 변수 $ 초 $ 및 $ 나노초 로 시간을 배포합니다.
예를 들어, 외부 서비스와의 일부 상호 작용에서 우리는 다음과 같은 방법으로 구현할 수있는 재 시도를 잘 제어하려고합니다.
$url = 'https://gitbox.net/api/retry';
for ($i = 0; $i < 5; $i++) {
$success = file_get_contents($url);
if ($success) {
break;
}
// 점차 지연 시간을 증가시킵니다
time_nanosleep(0, 250000000 * $i); // 매번 증가하십시오 0.25 두번째
}
전체 2 초를 직접 차단하지 않고 대기 시간을 점차 연장함으로써 사용자 경험이 향상되고 불필요한 자원 소비는 피합니다.
time_nanoSleep 의 두 번째 매개 변수는 운영 체제의 Timespec 구조의 TV_NSEC 필드에 직접 매핑되기 때문에 1 초 미만이어야 하며이 필드의 법적 가치의 상한은 999,999,999 나노초입니다. 이 설계는 시스템 호출의 일관성과 효율성을위한 것입니다. 이 제한을 이해하고 따르는 것은 PHP 프로그램에서 대기 시간 행동을보다 안전하고 세분화 할 수 있습니다.