注意事項

定時器使用注意事項

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