美文网首页
Swoole 两个不同的push方式

Swoole 两个不同的push方式

作者: HueyYao | 来源:发表于2020-12-29 21:36 被阅读0次

    Swoole 两个不同的push方式

    ①通过task任务队列 redis配合推送到客户端

    控制器层如下:

    
            $taskData = [
                'method' => 'pushLive',
                'data' => $data
            ];
    
            $_POST['ws_server']->task($taskData);
    

    websocket服务端代码如下:

        public function onTask($serv,$taskId,$workerId,$data){
            //分发task任务机制 不同的任务走不同的逻辑
            $obj = new app\common\lib\task\Task;
            $method = $data['method'];
            $flag = $obj->$method($data['data'],$serv);
            return $flag;
    
        }
    

    服务端实例Task类 的对应方法代码如下

        /**
         * 通过task机制发送赛况实时数据给客户端
         * @param $data
         * @param $serv swoole server对象
         */
        public function pushLive($data, $serv='false') {
            $clients = Predis::getInstance()->sMembers(config('redis.live_game_key'));
            foreach($clients as $fd) {
                $serv->push($fd,json_encode($data));
            }
        }
    

    通过此方法获取redis中的有序数列信息 并遍历发送想要传递的信息

    ②第二种方式 是直接在控制器中 通过swoole自己的方式来传递信息

    代码如下:

    <?php
    namespace app\index\controller;
    use app\common\lib\Util;
    class Chart
    {
        public function index(){
            $data = [
                'user' => "用户".rand(0, 2000),
                'content' => $_POST['content'],
            ];
            //  todo ports[1]代表服务端部署的第二个端口
            foreach($_POST['ws_server']->ports[1]->connections as $fd) {
                $_POST['ws_server']->push($fd, json_encode($data));
            }
            return Util::show(config('code.success'), 'ok', $data);
        }
    }
    

    两种方式在优化上 个人觉得第二种肯定是最好的 除去了一系列redis的操作 直接去发送到客户端 来达到相同的效果

    相关文章

      网友评论

          本文标题:Swoole 两个不同的push方式

          本文链接:https://www.haomeiwen.com/subject/musxoktx.html