注意事項
定時器使用注意事項
1、只能在onXXXX
回調中添加定時器。全域的定時器推薦在onWorkerStart
回調中設置,針對某個連接的定時器推薦在onConnect
中設置。
2、添加的定時任務在當前進程執行(不會啟動新的進程或者線程),如果任務很重(特別是涉及到網絡IO的任務),可能會導致該進程阻塞,暫時無法處理其他業務。所以最好將耗時的任務放到單獨的進程運行,例如建立一個/多個Worker進程運行
3、當前進程忙於其他業務時或者當一個任務沒有在預期的時間運行完,這時又到了下一個運行周期,則會等待當前任務完成才會運行,這會導致定時器沒有按照預期時間間隔運行。也就是說當前進程的業務都是串行執行的,如果是多進程則進程間的任務運行是并行的。
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重啟