$serv = new Swoole\Websocket\Server("127.0.0.1", 9502);
$serv->on('Open', function($server, $req) {
echo "connection open: ".$req->fd . "\n";
});
$serv->on('Message', function($server, $req) {
if ($req->data == 'allcoin') {
# 将客户端id加入到广播队列中
Db_Redis::hset(SwooleController::QU_ALLCOIN, $req->fd, 0);
# 首次请求先返回一次数据
if ($allcoin = Db_Redis::hget('market', 'allcoin')) {
$server->push($req->fd, SwooleController::parseData('allcoin', $allcoin));
}
} else if ($req->data == 'trends') {
# 立即返回数据
if ($trends = Db_Redis::hget('market', 'trends')) {
$server->push($req->fd, SwooleController::parseData('trends', $trends));
}
}
});
$serv->on('Close', function($server, $fd) {
# 连接断开时将客户端id从队列中删除
Db_Redis::hdel(SwooleController::QU_ALLCOIN, $fd);
});
$serv->on('WorkerStart', function ($server, $workerId) {
echo "worker started: {$workerId}\n";
if ($workerId == 0) {
# 定时推送数据
$server->tick(1000, function() use ($server) {
if (!$allcoin = Db_Redis::hget('market', 'allcoin')) return;
foreach ((array)Db_Redis::hkeys(SwooleController::QU_ALLCOIN) as $fd) {
# 防止意外情况,对队列中的客户端id检查是否存活
if (!$server->exist($fd)) {
Db_Redis::hdel(SwooleController::QU_ALLCOIN, $fd);
continue;
}
# 推数据数据 todo 优化,当数据没有更新时,不需要反复推送。
$server->push($fd, SwooleController::parseData('allcoin', $allcoin));
}
});
}
});
$serv->start();
swoole定时器
最新推荐文章于 2024-03-19 22:54:57 发布