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

 

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