Swoole從入門到入土(21)——毫秒定時器

Swoole提供了毫秒精度的定時器,全部操做都是內存操做,無額外的IO開銷。php

下面讓咱們一塊兒詳細瞭解每一個函數的做用:編程

1) 函數tick:設置一個間隔時鐘定時器,這個定時器會持續觸發函數

Swoole\Timer::tick(int $msec, callable $callback_function, ...$params): int

$mesc:指定時間,單位毫秒【如 1000 表示 1 秒,v4.2.10 如下版本最大不得超過 86400000】學習

$callback_function:時間到期後所執行的函數,必須是能夠調用的,格式爲:callbackFunction(int $timer_id, ...$params),能夠使用匿名函數的 use 語法傳遞參數到回調函數中。spa

$params:給執行函數傳遞數據【此參數也爲可選參數】設計

返回值:定時器的IDcode

示例:協程

Swoole\Timer::tick(3000, function (int $timer_id, $param1, $param2) {
    echo "timer_id #$timer_id, after 3000ms.\n";
    echo "param1 is $param1, param2 is $param2.\n";

    Swoole\Timer::tick(14000, function ($timer_id) {
        echo "timer_id #$timer_id, after 14000ms.\n";
    });
}, "A", "B");

注意事項:blog

定時器的校訂:定時器回調函數的執行時間不影響下一次定時器執行的時間。實例:在 0.002s 設置了 10ms 的 tick 定時器,第一次會在 0.012s 執行回調函數,若是回調函數執行了 5ms,下一次定時器仍然會在 0.022s 時觸發,而不是 0.027s。但若是定時器回調函數的執行時間過長,甚至覆蓋了下一次定時器執行的時間。底層會進行時間校訂,丟棄已過時的行爲,在下一時間回調。如上面例子中 0.012s 時的回調函數執行了 15ms,本該在 0.022s 產生一次定時回調。實際上本次定時器在 0.027s 才返回,這時定時早已過時。底層會在 0.032s 時再次觸發定時器回調。進程

協程模式:在協程環境下 Timer::tick 回調中會自動建立一個協程,能夠直接使用協程相關 API。

 

2) 函數after():在指定的時間後執行函數。Swoole\Timer::after 函數是一個一次性定時器,執行完成後就會銷燬。此函數與 PHP 標準庫提供的 sleep 函數不一樣,after 是非阻塞的。

Swoole\Timer::after(int $msec, callable $callback_function, ...$params): int

$mesc:指定時間,單位毫秒【如 1000 表示 1 秒,v4.2.10 如下版本最大不得超過 86400000】

$callback_function:時間到期後所執行的函數,必須是能夠調用的,格式爲:callbackFunction(int $timer_id, ...$params),能夠使用匿名函數的 use 語法傳遞參數到回調函數中。

$params:給執行函數傳遞數據【此參數也爲可選參數】

返回值:定時器的ID

示例:

$timer_id=Swoole\Timer::tick(1000, function () {
    echo "after 1000ms.\n";
});
Swoole\Timer::after(10000,function() use ($timer_id){
    echo "clear:\n";
    Swoole\Timer::clear($timer_id);
});

 

3) 函數clear():使用定時器 ID 來刪除定時器。

Swoole\Timer::clear(int $timer_id): bool

$timer_id:定時器 ID【調用 Timer::tick、Timer::after 後會返回一個整數的 ID】

注意:Swoole\Timer::clear 不能用於清除其餘進程的定時器,只做用於當前進程

 

4) clearAll():清除當前 Worker 進程內的全部定時器。

Swoole\Timer::clearAll(): bool

 

5) info():返回 timer 的信息。

Swoole\Timer::info(int $timer_id): array

返回值示例:

array(4) {
  ["exec_msec"]=>
  int(1000)
  ["interval"]=>
  int(0)
  ["round"]=>
  int(0)
  ["removed"]=>
  bool(false)
}

 

6) 函數list():返回定時器迭代器,可以使用 foreach 遍歷當前 Worker 進程內全部 timer 的 id

Swoole\Timer::list(): Swoole\Timer\Iterator

示例:

foreach (Swoole\Timer::list() as $timer_id) {
    var_dump(Swoole\Timer::info($timer_id));
}

 

7) 函數stat():查看定時器狀態。

Swoole\Timer::stats(): array

返回值示例:

array(3) {
  ["initialized"]=>
  bool(true)
  ["num"]=>
  int(1000)
  ["round"]=>
  int(1)
}

 

8) 函數set():設置定時器相關參數。

Swoole\Timer::set(array $array): void

例如:默認定時器在執行回調函數時會自動建立協程,可單獨設置定時器關閉協程。

Swoole\Timer::set([
  'enable_coroutine' => false,
]);

 

Swoole毫秒定時器的內容相對比較簡單,這一節到此就要結束了。請關注後續的多進程與協程核心API的討論。

 

 

---------------------------  我是可愛的分割線  ----------------------------

最後博主借地宣傳一下,漳州編程小組招新了,這是一個面向漳州青少年信息學/軟件設計的學習小組,有意向的同窗點擊連接,聯繫我吧。

相關文章
相關標籤/搜索