현재 위치: > 최신 기사 목록> Time_NanoSleep을 사용하여 정확한 작업 스케줄러를 구현하십시오

Time_NanoSleep을 사용하여 정확한 작업 스케줄러를 구현하십시오

gitbox 2025-05-27

웹 개발에서 PHP는 전통적으로 장기 실행 프로세스 또는 작업 예약 시스템에 부적합한 것으로 간주됩니다. 그러나 CLI 모드에 대한 지원이 향상되고 Time_NanoSleep 과 같은 일부 기본 기능의 가용성으로 인해 PHP는 실제로 약간의 가벼우면서도 시간에 맞는 스케줄링 작업을 수행 할 수 있습니다.

이 기사에서는 Time_NanoSleep을 사용하여 간단하지만 고정밀 작업 스케줄러를 구축하여 밀리 초 또는 마이크로 초 정밀도로 정기적 인 작업을 수행하는 방법을 소개합니다.

1. Time_nanoSleep을 사용하는 이유

Sleep ()Usleep () 와 같은 PHP의 기존 지연 기능은 각각 두 번째 및 마이크로 초 지연 지연을 지원하지만 실제 작동에서는 항상 충분히 정확하지는 않으며 Usleep 의 정확도는 일부 플랫폼에서 제한됩니다.

대조적으로, Time_nanoSleep은 나노 초 수준의 시간 제어를 제공합니다.

 bool time_nanosleep(int $seconds, int $nanoseconds): bool|array

이를 통해 각 스케줄링 사이클의 시간을보다 세분화하여 제어 할 수 있으므로 거의 실시간 작업 실행을 달성 할 수 있습니다.

2. 빌딩 스케줄러에 대한 기본 아이디어

작업 스케줄러의 핵심 아이디어는 다음과 같습니다.

  1. 작업 목록을 정의하면 각 작업에는 실행주기가 있습니다.

  2. 무한 루프에서 현재 시간을 감지하고;

  3. 다음 실행주기를 정확하게 기다리십시오.

  4. 대상 시간에 도달하면 작업을 실행하십시오.

3. 샘플 코드

다음은 간단한 고정밀 PHP 스케줄러의 구현 예입니다.

 <?php

class TaskScheduler
{
    private array $tasks = [];

    public function addTask(callable $task, float $interval): void
    {
        $this->tasks[] = [
            'callback' => $task,
            'interval' => $interval, // 단위:두번째,소수점 지원
            'next_run' => microtime(true) + $interval
        ];
    }

    public function run(): void
    {
        while (true) {
            $now = microtime(true);

            foreach ($this->tasks as &$task) {
                if ($now >= $task['next_run']) {
                    call_user_func($task['callback']);
                    $task['next_run'] = $now + $task['interval'];
                }
            }

            // 정확한 대기 1 毫두번째,피하다CPU너무 높은 점유
            time_nanosleep(0, 1_000_000);
        }
    }
}

// 예:모든0.5두번째输出一次时间戳
$scheduler = new TaskScheduler();

$scheduler->addTask(function () {
    echo "작업 실행 시간:" . date('Y-m-d H:i:s.u') . PHP_EOL;
}, 0.5);

// 예:모든2두번째执行一次시뮬레이션 요청
$scheduler->addTask(function () {
    $url = "https://gitbox.net/api/ping";
    echo "요청 $url" . PHP_EOL;
    // 실제 시나리오에서 사용할 수 있습니다 curl 또는 file_get_contents 시뮬레이션 요청
}, 2.0);

// 스케줄러를 시작하십시오
$scheduler->run();

4. 주목할만한 것들

  1. CPU 점유 : 스케줄러가 무한 루프에 있기 때문에 Time_NanoSleep 과 같은 기능을 사용하여 CPU 점유를 줄이는 것이 좋습니다.

  2. 오류 축적 문제 :이 예에서는 Next_Run을 설정하는 방법을 사용하여 "현재 시간 + 사이클에서 시작하여"더 나은 제어 오류 축적을 위해 사용됩니다.

  3. 예외 처리 : 실제 환경에서 작업이 스케줄러 작동을 방해하는 것을 방지하기 위해 Try-Catch를 추가하는 것이 좋습니다.

  4. 작업 격리 : 작업이 너무 오래 걸리면 다른 작업의 실행에 영향을 줄 수 있습니다. 다중 프로세스 또는 PCNTL_FORK를 사용하여 병렬 처리를 구현할 수 있습니다.

5. 응용 프로그램 시나리오

  • 정확하게 제어 된 자동 데이터 동기화

  • 마이크로 초 (예 : IoT)로 한 번에 메시지 보내기

  • PHP 로컬 데몬 또는 폴링 서비스를 구축하십시오

결론

PHP는 시스템 수준 스케줄링 용으로 설계되지 않았지만 Time_NanoSleep 과 같은 기능을 통해 정밀도가 높은 작업 스케줄러를 여전히 구축 할 수 있습니다. 높은 실시간 기능이 필요하지만 복잡한 툴체인을 도입하는 데 적합하지 않은 소규모 응용 프로그램 또는 스크립트 작업에 적합합니다. 앞으로 Coroutines 및 Swooles와 같은 확장과 결합 된 PHP의 타이밍 스케줄링 기능은 여전히 ​​개선 할 여지가 더 많습니다.