현재 위치: > 최신 기사 목록> time_nanosleep 사용을위한 모범 사례 및 보안 제안

time_nanosleep 사용을위한 모범 사례 및 보안 제안

gitbox 2025-05-20

Sleep ()Usleep () 는 PHP에서 지연된 작업을 수행 할 때 가장 일반적으로 언급 된 기능입니다. 그러나 Time_nanosleep ()는 더 정확한 지연 제어가 필요할 때, 특히 나노초 정밀도가 필요할 때 없어서는 안될 도구가됩니다. 이 기사는 Time_nanoSleep () 의 사용 방법, 일반적인 모범 사례 및 실제 개발의 관련 보안 및 성능 트랩을 피하는 방법을 자세히 분석합니다.

1. 기능 소개

time_nanoSleep () 는 PHP가 제공 한 함수로 지정된 시간 동안 프로그램 실행을 일시 중지 할 수 있으며 몇 초 및 나노 초의 정확도가 있습니다. 기능 프로토 타입은 다음과 같습니다.

 bool time_nanosleep(int $seconds, int $nanoseconds)

매개 변수 설명 :

  • $ 초 : 정수 초.

  • $ 나노 초 : 정수 나노초 (0 ~ 999,999,999).

반품 값 :

  • 진정한 반환은 성공을 의미합니다.

  • 거짓을 반환하거나 예외를 던지면 오류 또는 인터럽트가 나타납니다.

대기 기간 동안 시스템 신호에 의해 함수가 중단되면 미완성 된 시간이 포함 된 배열을 반환합니다.

 [
    "seconds" => int,
    "nanoseconds" => int
]

2. 기본 사용

사용하는 가장 쉬운 방법은 다음과 같습니다.

 <?php
echo "시작을 기다리십시오...\n";
time_nanosleep(1, 500000000); // 정지시키다 1.5 두번째
echo "끝을 기다리십시오。\n";

위의 코드는 프로그램을 1.5 초 동안 일시 중지 한 다음 후속 논리를 계속 실행합니다.

3. 신호 중단 처리

생산 환경에서 Time_nanoSleep ()는 신호 중단으로 인해 미리 돌아올 수 있습니다. 다음은이를 처리하는 안전한 방법입니다.

 <?php
$seconds = 2;
$nanoseconds = 0;

do {
    $result = time_nanosleep($seconds, $nanoseconds);
    if (is_array($result)) {
        // 중단 된 경우,나머지 시간을 업데이트하십시오
        $seconds = $result["seconds"];
        $nanoseconds = $result["nanoseconds"];
        echo "신호에 의해 중단되었습니다,다시 기다리십시오...\n";
    }
} while (is_array($result));

echo "완료 지연。\n";

이 글쓰기 방법은 중간에 중단 되더라도 지연이 완전히 실행되도록합니다.

4. 일반적인 오류 및 예방 조치

1. 매개 변수 범위

나노 초 매개 변수의 최대 값은 999,999,999로,이 값을 초과하는이 값을 초과합니다.

 Warning: time_nanosleep(): nanoseconds out of range

해결책은 초과 부품을 초로 변환하는 것입니다.

 $ns = 1_500_000_000; // 초과하다 1 두번째的纳두번째数
$seconds = intdiv($ns, 1_000_000_000);
$nanoseconds = $ns % 1_000_000_000;
time_nanosleep($seconds, $nanoseconds);

2. 고정밀 타이머와 함께 사용하십시오

시간을 정확하게 제어 해야하는 경우 hrtime () 와 함께 사용할 수 있습니다.

 $start = hrtime(true); // 纳두번째计时器
time_nanosleep(0, 500000000); // 기다리다 0.5 두번째
$end = hrtime(true);
$elapsed = ($end - $start) / 1e9;
echo "실제 시간 소모: {$elapsed} 두번째\n";

5. 다른 지연 함수와 비교

기능 정확성 방해 할 수 있습니까? 플랫폼 지원
잠() 두번째 크로스 플랫폼
usleep () 마이크로 초 아니요 Windows <= php 5.3은 지원하지 않습니다
time_nanosleep () 나노 초 크로스 플랫폼

6. 실제 응용 시나리오

1. 속도 제한 처리 (예 : API와 같은 스로틀 링)

 foreach ($requests as $request) {
    call_api("https://gitbox.net/api/send", $request);
    time_nanosleep(0, 250000000); // 모든 250ms 요청
}

2. 미세 동시성 제어

멀티 스레드 또는 다중 프로세스 작업을 사용하는 경우 리소스 경쟁을 피하기 위해 약간의 지연이 추가 될 수 있습니다.

 for ($i = 0; $i < 5; $i++) {
    fork_process($i);
    time_nanosleep(0, 100000000); // 100ms 지연,갈등을 피하십시오
}

3. 애니메이션 또는 폴링 대기

예를 들어 CLI 애니메이션을 만들 때 :

 $frames = ['-', '\\', '|', '/'];
while (true) {
    foreach ($frames as $frame) {
        echo "\r로딩 $frame";
        time_nanosleep(0, 100000000); // 0.1 두번째
    }
}

7. 안전 조언

time_nanosleep ()는 편리하지만 다음과 같은 자원 차단 공격에도 사용할 수 있습니다.

 // 恶意지연造成的服务阻断
time_nanosleep(10, 0);

제안:

  • 사용자가 지연 매개 변수를 제어하도록 허용하지 마십시오.

  • 최대 한계 및 로그 지연 로그를 사용하십시오.

  • 핵심 프로세스를 보호하기 위해 타임 아웃 및 워치 독 메커니즘과 협력하십시오.

결론

Time_nanosleep ()는 고정밀 대기 시간 제어를 제공하며 일부 세분화 작업에서 수면 () 보다 더 적합한 강력한 도구입니다. 합리적으로 사용하면 지연 처리, 동시 제어 및 조절이 더 유연하고 효율적으로 만들 수 있습니다. 그러나 과도하거나 부적절하게 사용하면 성능 폐기물 및 안전 문제가 발생할 수 있습니다. 따라서 원칙을 마스터하는 데 기초하여 조심스럽고 전략적으로 사용하는 것은 모든 PHP 개발자가 가져야 할 능력입니다.