需要用ws链接其他服务器的,然后收到数据后转发给自己的客户端
现在用的是AsyncTcpConnection
看文档AsyncTcpConnection 定义在onWorkerStart中但是worker有多个进程会导致启动多个
想的有几个方案哪个方案比较好呢,或者有没有更好的方案推荐
// 方案1:
// 一个channel
// workerA 去链接外部服务器 收到消息使用channel发给客户端 并监听workerB客户端的消息
// workerB 在onWorkerStart中 监听channel的消息 发给客户端 并监听客户端消息发给workerA
$channel_server = new Channel\Server();
// workerA负责接收其他服务器信息并发布给B
$workerA = new Worker();
$workerA->onWorkerStart = function($worker){
Channel\Client::connect('127.0.0.1', 2206);
$otherServer = new AsyncTcpConnection("ws://0.0.0.0:8765");
$otherServer->onMessage = function($con, $data){
Channel\Client::publish('newData','新数据');
};
$otherServer->connect();
//监听客户端要给other发消息
Channel\Client::on('clientData', function($event_data)use($otherServer){
$otherServer->send($event_data);
});
};
//workerB负责接收信息并发布给客户端
$workerB = new Worker("websocket://0.0.0.0:1002");
$workerB->count = 4;
$workerB->onWorkerStart = function($worker){
Channel\Client::connect('127.0.0.1', 2206);
Channel\Client::on('newData', function($event_data)use($worker){
// 向所有客户端广播消息
foreach($worker->connections as $connection)
{
$connection->send($event_data);
}
});
};
$workerB->onMessage = function($con,$data){
Channel\Client::publish('clientData','客户端给other发消息');
};
Worker::runAll();
另外使用全局变量是否可行呢
$otherServer;
$workerA = new Worker();
$workerB = new Worker("websocket://0.0.0.0:1002");
$workerB->count = 4;
$workerA->onWorkerStart = function($worker){
global $otherServer;
$otherServer = new AsyncTcpConnection("ws://0.0.0.0:8765");
$otherServer->onMessage = function($con, $data){
global $workerB;
foreach($workerB->connections as $connection)
{
$connection->send($data);
}
};
$otherServer->connect();
};
$workerB->onMessage = function($con,$data){
global $otherServer;
$otherServer->send($data);
};
Worker::runAll();
根据进程编号去设置:https://www.workerman.net/doc/workerman/worker/workerid.html#%E8%8C%83%E4%BE%8B
感觉这个方式比较乱
那你就用类似redis的订阅的方式
就一个if判断怎么会比较乱
和channel 一样吧
因为想要一个进程只负责访问远程服务器这块 如果用进程编号的话 他不仅操作了远程服务器还进行了其他业务逻辑的处理 如果再用上路由 那就又麻烦了
gatewayworker配合redis之类的订阅也能实现
用多个worker么,一个推送 一个订阅?那客户端发给other呢也用订阅么,收到客户端消息 推送,other监听
我觉得用专业的消息中间件,一个ws只管接收然后发布到MQ里面。另外启动一个程序专门来消费MQ消息。
那就不是服务器主动推送了
???你这样可以解耦啊。ws拉别人服务器专门一台,自己推送一台