swoole定时器

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

猜你喜欢

转载自blog.csdn.net/qq_40393605/article/details/80346018