美文网首页
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