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