주의 사항
타이머 사용 주의 사항
-
타이머는
onXXXX
콜백에서만 추가할 수 있습니다. 전역 타이머는onWorkerStart
콜백에서 설정하는 것이 좋으며, 특정 연결을 위한 타이머는onConnect
에서 설정하는 것이 좋습니다. -
추가된 타이머 작업은 현재 프로세스에서 실행됩니다(새로운 프로세스나 스레드를 시작하지 않음). 만약 작업이 무거우면(특히 네트워크 IO를 포함하는 작업인 경우) 현재 프로세스가 차단되어 다른 비즈니스를 처리할 수 없을 수도 있습니다. 따라서 시간이 오래 걸리는 작업은 별도의 프로세스에서 실행하는 것이 좋습니다. 예를 들어 별도의 Worker 프로세스를 하나 이상 실행하는 것 등이 있습니다.
-
현재 프로세스가 다른 비즈니스에 주로 종사하거나, 작업이 예상 시간 내에 완료되지 않았을 때 다음 실행 주기로 넘어가게 되면 현재 작업이 완료될 때까지 기다리게 되며, 이로 인해 타이머가 예상한 시간 간격으로 실행되지 않을 수 있습니다. 즉, 현재 프로세스 내의 비즈니스는 직렬로 실행되지만, 여러 프로세스의 경우 프로세스 간의 작업은 병렬적으로 실행됩니다.
-
여러 프로세스에 타이머를 설정하면 병렬 문제가 발생할 수 있습니다. 예를 들어 아래 코드는 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를 참조하세요.
-
약 1밀리초의 오차가 있을 수 있습니다.
-
타이머는 프로세스 간에 삭제할 수 없으며, 예를 들어 a 프로세스에서 설정한 타이머는 b 프로세스에서 Timer::del 인터페이스를 사용하여 직접 삭제할 수 없습니다.
-
다른 프로세스 간의 타이머 ID는 중복될 수 있지만, 하나의 프로세스 내에서 생성된 타이머 ID는 중복되지 않습니다.
-
시스템 시간을 변경하면 타이머의 동작에 영향을 줄 수 있으므로 시스템 시간을 변경한 후에는 restart로 다시 시작하는 것이 좋습니다.