주의 사항

타이머 사용 주의 사항

  1. 타이머는 onXXXX 콜백에서만 추가할 수 있습니다. 전역 타이머는 onWorkerStart 콜백에서 설정하는 것이 좋으며, 특정 연결을 위한 타이머는 onConnect에서 설정하는 것이 좋습니다.

  2. 추가된 타이머 작업은 현재 프로세스에서 실행됩니다(새로운 프로세스나 스레드를 시작하지 않음). 만약 작업이 무거우면(특히 네트워크 IO를 포함하는 작업인 경우) 현재 프로세스가 차단되어 다른 비즈니스를 처리할 수 없을 수도 있습니다. 따라서 시간이 오래 걸리는 작업은 별도의 프로세스에서 실행하는 것이 좋습니다. 예를 들어 별도의 Worker 프로세스를 하나 이상 실행하는 것 등이 있습니다.

  3. 현재 프로세스가 다른 비즈니스에 주로 종사하거나, 작업이 예상 시간 내에 완료되지 않았을 때 다음 실행 주기로 넘어가게 되면 현재 작업이 완료될 때까지 기다리게 되며, 이로 인해 타이머가 예상한 시간 간격으로 실행되지 않을 수 있습니다. 즉, 현재 프로세스 내의 비즈니스는 직렬로 실행되지만, 여러 프로세스의 경우 프로세스 간의 작업은 병렬적으로 실행됩니다.

  4. 여러 프로세스에 타이머를 설정하면 병렬 문제가 발생할 수 있습니다. 예를 들어 아래 코드는 1초마다 5번 출력됩니다.

    $worker = new Worker();
    // 5개의 프로세스
    $worker->count = 5;
    $worker->onWorkerStart = function(Worker $worker) {
    // 5개의 프로세스마다 이러한 타이머가 있음
    Timer::add(1, function(){
        echo "hi\r\n";
    });
    };
    Worker::runAll();

    하나의 프로세스에서만 타이머를 실행하려면 Timer::add 예제 2를 참조하세요.

  5. 약 1밀리초의 오차가 있을 수 있습니다.

  6. 타이머는 프로세스 간에 삭제할 수 없으며, 예를 들어 a 프로세스에서 설정한 타이머는 b 프로세스에서 Timer::del 인터페이스를 사용하여 직접 삭제할 수 없습니다.

  7. 다른 프로세스 간의 타이머 ID는 중복될 수 있지만, 하나의 프로세스 내에서 생성된 타이머 ID는 중복되지 않습니다.

  8. 시스템 시간을 변경하면 타이머의 동작에 영향을 줄 수 있으므로 시스템 시간을 변경한 후에는 restart로 다시 시작하는 것이 좋습니다.