현재 위치: > 최신 기사 목록> time_nanoSlee 수면 인터럽트 신호에 의해 중단되면 어떻게해야합니까?

time_nanoSlee 수면 인터럽트 신호에 의해 중단되면 어떻게해야합니까?

gitbox 2025-05-27

PHP에서 Time_nanosleep () 함수는 나노 초 정밀도로 지정된 시간 동안 프로그램을 수면하는 데 사용됩니다. 예를 들어 사용하기가 매우 간단합니다.

 time_nanosleep(1, 500000000); // 잠1.5두번째

그러나 실제로 사용하면 Time_NanoSleep ()는 시스템 신호 (예 : 인터럽트 신호)에 의해 중단되어 수면이 일찍 끝날 수 있습니다. 이 경우, 함수는 부울 아닌 나머지 초와 나노초를 포함하는 배열을 반환합니다.

신호에 의해 왜 중단 되는가?

Linux 또는 Unix 시스템에서 프로세스는 다양한 신호 (예 : Sigint, Sigtern 등)를 수신하여 수면 상태를 방해하여 Time_nanoSleep ()가 반환됩니다. PHP 자체는 자동으로 수면을 재 시도하지 않으므로 수면 시간이 부정확합니다.

판단하고 회복하는 방법?

Time_NanoSleep ()가 신호에 의해 중단되면 true를 반환하지 않지만 배열을 반환합니다.

 [
    'seconds' => 剩余두번째数,
    'nanoseconds' => 剩余纳두번째数,
]

이를 바탕으로 완전한 수면 시간을 보장하기 위해 루프를 작성할 수 있습니다.

 function reliable_nanosleep(int $seconds, int $nanoseconds): void {
    while (true) {
        $result = time_nanosleep($seconds, $nanoseconds);
        if ($result === true) {
            // 수면이 성공적으로 완료되었습니다
            break;
        }
        // 신호에 의해 중단되었습니다,$result 남은 시간이 포함됩니다
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    }
}

이 기능은 전체 수면이 완료 될 때까지 나머지 수면 시간을 계속 재 시도합니다.

완전한 샘플 코드

 <?php
function reliable_nanosleep(int $seconds, int $nanoseconds): void {
    while (true) {
        $result = time_nanosleep($seconds, $nanoseconds);
        if ($result === true) {
            break;
        }
        $seconds = $result['seconds'];
        $nanoseconds = $result['nanoseconds'];
    }
}

// 예:잠2.3두번째
echo "开始잠\n";
reliable_nanosleep(2, 300000000);
echo "잠结束\n";
?>

추가 조언

  • 신호 처리 : 프로그램이 신호를 처리 해야하는 경우 PCNTL_Signal () 과 함께 신호 처리 기능을 설정하여 인터럽트 동작을보다 합리적으로 관리하는 것이 좋습니다.

  • 대안 : 시스템 환경이 usleep () 또는 sleep ()를 지원하는 경우 사용할 수 있지만 정밀도가 낮습니다.


더 많은 PHP 관련 정보는 자세한 문서 및 예에 대해서는 gitbox.net/php-docs 를 참조하십시오.