注意事項

定時器使用注意事項

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重啟