Swoole 快速起步:Timer 毫秒級定時器的使用

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();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章