PHP에서 Time_nanosleep 은 지연을 정확하게 제어하기위한 기능으로, 개발자가 몇 초 및 나노초 내에 프로그램 실행을 일시 중지 할 수 있습니다. 그것은 수면 이나 잠 들어있는 것 보다 더 높은 시간적 해상도를 제공합니다. 그러나 개발자는 종종 time_nanosleep을 사용할 때 "작동하지 않는 것"문제가 발생합니다. 이 기사에서는 가능한 이유와 디버깅 방법에 대해 설명합니다.
<?php
echo "시작...\n";
time_nanosleep(0, 500000000); // 정지시키다0.5두번째
echo "마치다...\n";
?>
이 예에서 프로그램은 "시작 ..."를 출력 한 후 "END ..."를 출력 한 후 0.5 초 동안 일시 중지해야합니다.
매우 짧은 지연 (예 : 100 밀리 초 이하)을 사용하려고하면 터미널 또는 브라우저 출력에서 지연 효과를 감지하기가 어렵습니다. 예를 들어:
time_nanosleep(0, 100000); // 0.1毫두번째
현재 지연은 매우 짧으며 루프 또는 성능에 민감한 환경에서 실행 시간을 계산하지 않으면 지연이 거의 불가능합니다.
웹 페이지에서 time_nanosleep을 사용하는 경우 브라우저는 서버 측의 중간 출력을 즉시 표시하지 않습니다. 즉, 서버 측에서 0.5 초 동안 일시 중지하더라도 전체 페이지가 렌더링을 마칠 때까지 브라우저에 콘텐츠가 표시되지 않을 수 있습니다.
솔루션은 버퍼 제어 기능을 사용하는 것입니다.
ob_flush();
flush();
time_nanosleep(0, 500000000);
echo "계속 실행하십시오";
그러나 웹 서버 (예 : Nginx 또는 Apache)의 출력 버퍼 설정 자체도 효과에 영향을 미칩니다.
모든 운영 체제 및 PHP 컴파일 환경이 나노초에 대한 대기 시간을 정확하게 지원할 수있는 것은 아닙니다. 일부 플랫폼에서 Time_nanoSleep은 대략적인 구현으로 저하 될 수 있으며, 여기서 실제 지연이 예상 값에서 바이어스 될 수 있습니다. HRTIME (true)을 사용하여 실제 지연을 확인할 수 있습니다.
$start = hrtime(true);
time_nanosleep(0, 500000000);
$end = hrtime(true);
echo "지연 시간: " . ($end - $start) / 1e6 . " 毫두번째";
출력이 500 밀리 초보다 훨씬 큰 경우 시스템 수준이 정확한 지연을 지원하지 않음을 의미 할 수 있습니다.
런타임 중에 PHP 스크립트가 중단 된 경우 (예 : 사용자 중단, 시간 초과 설정, Blunt Exit () ) 인 Time_NanoSleep은 실행을 완료 할 기회가 없을 수 있습니다. INGORE_USER_ABORT (true) 를 설정하여 테스트 할 수 있습니다.
ignore_user_abort(true);
time_nanosleep(1, 0);
hrtime ()은 나노 초 레벨 타임 스탬프를 제공하며, 이는 지연이 적용되는지 확인하는 데 이상적입니다.
명령 줄 환경의 출력은 실시간이므로 Time_nanoSleep 의 동작을보다 쉽게 관찰 할 수 있습니다.
php test_sleep.php
프로그램에 로깅 지점 삽입 :
file_put_contents('/var/log/sleep.log', date('H:i:s') . " before\n", FILE_APPEND);
time_nanosleep(0, 500000000);
file_put_contents('/var/log/sleep.log', date('H:i:s') . " after\n", FILE_APPEND);
두 로그 간의 시차를 관찰하면 지연이 효과적인지 효과적으로 결정할 수 있습니다.
고주파 루프에서 Time_NanoSleep을 사용하는 경우 상단 또는 HTOP 도구를 사용하여 CPU 사용이 감소했는지 확인하여 일시 중지가 실제로 발생했는지 여부를 확인할 수 있습니다.
https://gitbox.net/api/ping 에 여러 요청을 보내고 있다고 가정하고 각 요청 사이에 0.25 초 동안 일시 중지해야합니다.
for ($i = 0; $i < 5; $i++) {
file_get_contents("https://gitbox.net/api/ping");
echo "1. $i 요청이 완료되었습니다\n";
time_nanosleep(0, 250000000); // 250毫두번째
}
CLI와 HRTIME ()을 결합하면 지연 효과를보다 정확하게 확인할 수 있습니다.
Time_nanoSleep 은 PHP에서 실용적이지만 오해 지연 기능입니다. 유효하지 않으며 플랫폼 지원, 실행 환경 및 출력 버퍼링 메커니즘으로 제한됩니다. 이러한 차이를 이해하고 디버깅 기술을 결합하면 Time_NanoSleep을 효과적으로 사용하여보다 정확한 지연 제어를 달성 할 수 있습니다.