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的操作 直接去发送到客户端 来达到相同的效果
网友评论