주의 사항

타이머 사용 주의 사항

  1. 타이머는 반드시 onXXXX 콜백 내에서 추가해야 합니다. 전역 타이머는 onWorkerStart 콜백에서 설정하는 것이 좋으며, 특정 연결에 대한 타이머는 onConnect에서 설정하는 것이 좋습니다.

  2. 추가된 타이머 작업은 현재 프로세스에서 실행되며(새로운 프로세스나 스레드를 시작하지 않음), 무거운 작업은 현재 프로세스의 다른 작업 실행에 영향을 미칠 수 있으므로, 시간이 많이 소요되는 작업은 별도의 프로세스에서 실행하는 것이 좋습니다. 예를 들어, 하나 이상의 Worker 프로세스를 생성하여 실행합니다.

  3. 현재 프로세스에서 swoole/swow 협정이 활성화되지 않은 경우, 현재 프로세스가 다른 비즈니스로 바쁘거나 작업이 예상 시간 내에 완료되지 않을 경우, 다음 실행 주기가 도래하더라도 현재 작업이 완료될 때까지 기다리게 됩니다. 이로 인해 타이머가 예상 시간 간격으로 실행되지 않을 수 있습니다. 즉, 현재 프로세스의 비즈니스는 모두 직렬로 실행되며, 다중 프로세스인 경우 프로세스 간 작업 실행은 병렬로 진행됩니다.

  4. 다중 프로세스에서 타이머 작업을 설정하면 동시성 문제가 발생할 수 있습니다. 예를 들어, 아래 코드는 매초 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로 재시작하는 것이 좋습니다.