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的討論。
--------------------------- 我是可愛的分割線 ----------------------------
最後博主借地宣傳一下,漳州編程小組招新了,這是一個面向漳州青少年信息學/軟件設計的學習小組,有意向的同窗點擊連接,聯繫我吧。