swoole 提供了類似 JavaScript 的 setInterval | setTimeout 異步高精度定時器 Timer,與 PHP
本身的 pcntl_alarm
相比,Timer
更精確(毫秒級別)、性能更高(異步)、可同時設定多個定時器程序,本文以 WebSocket 服務器爲爲例,在監聽到新連接時,添加個定時器 demo。
文檔介紹:https://wiki.swoole.com/wiki/page/p-timer.html。
開始使用
1. Timer::tick - tick
定時器會每隔指定秒數持續觸發,直到調用Timer::clear
清除。
<?php
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
// 監聽連接
$server->on('open', function ($server, $request) {
echo date("Y-m-d H:i:s") . " start!!\n";
$count = 0;
Swoole\Timer::tick(5000, function ($timer_id) use (&$count) {
$count++;
echo date("Y-m-d H:i:s") . ": timer-{$timer_id} 的第 {$count} 次請求!!\n";
if ($count >= 3) {
echo "{$count} 請求之後,定時計劃結束!!\n";
Swoole\Timer::clear($timer_id);
}
});
echo date("Y-m-d H:i:s") . " end!!\n";
});
// 監聽 WebSocket 消息事件
$server->on('message', function ($server, $frame) {});
// go
$server->start();
結果如下:
2 . Timer::after - 在指定的時間後執行的一次性定時器函數,執行完成後就會銷燬。
<?php
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
// 監聽連接
$server->on('open', function ($server, $request) {
echo date("Y-m-d H:i:s") . " start!!\n";
Swoole\Timer::after(5000, function () {
echo date("Y-m-d H:i:s") . ": timer working!!\n";
});
echo date("Y-m-d H:i:s") . " end!!\n";
});
// 監聽 WebSocket 消息事件
$server->on('message', function ($server, $frame) {});
// go
$server->start();
結果如下:
3. Timer::clear - 使用定時器ID
來刪除定時器。
bool Swoole\Timer::clear(int $timer_id);
4. Timer::clearAll - 清除所有的定時器
bool Timer::clearAll();
5. Timer::info - 返回timer的信息
array Timer::info(int $id);
6. Timer::list - 返回定時器迭代器
Timer\Iterator Timer::list();