workerman中有多条进程,多个用户进来,$worker里的connection连接数不在同一个上

henry

$worker = new Worker('websocket://0.0.0.0:9393', $context);
$worker->transport = 'ssl';
// 启动4个进程对外提供服务
$worker->count = 24;比如有三个用户进来,worker->connection的个数只有两个?其他的到其他进程去了?

阅读 2750
4个回答

henry

接着我想把id和connection组成的数据放到缓存里,一旦connection放在数据中,这个数组就没数据,这是什么原因呢?
 
如: 
$info =

  • 暂无评论
walkor

这个数组在每个进程都有一个,每个进程的变量是独立的,不能共享。
设置成但进程就好了

  • henry 2019-01-04

    每个进程都是独立的没关系的,我是把这个数组放在redis缓存里了,缓存是针对整个服务器的

  • henry 2019-01-04

    我是不想把他设置为单进程,所以才引入缓存这个东西存储每个进程的connection

  • henry 2019-01-04

    单进程我担心连接数太多,扛不住,我们会多个房间同时开启websocket

  • henry 2019-01-04

    问题是在于:我把connection变量放在数组里,直接打印数组为空

walkor

外部存储无法存储内存里的资源变量,就像你无法在redis里存储mysql连接对象一样

  • henry 2019-01-04

    那我如何能保存所有的连接呢,用于后续发给所有的用户,进程数不设为1的情况

  • walkor 2019-01-04

    用gatewayWorker吧,这些都写好的

  • henry 2019-01-04

    workerman如何实现晓得吗

  • walkor 2019-01-04

    workerman手册channel组件里有例子。

  • henry 2019-01-04

    我就是不知道自己实现该怎么存储,谢谢你

henry

追加另一个问题:我在用gateway的时候,gateway和businessworker都启动了4条进程,然后我在Event.php中处理OnWorkerStart函数:

echo "进去定时器了哦\n";
Timer::add(10, function(){
    echo "timer\n";
    Gateway::sendToGroup(321, '发送定时信息1');
});

进去定时器了哦 这句话会执行4次,定时器里面也每10秒发送4次相同的数据,我该怎样做,才能实现发送一次呢

  • henry 2019-01-08

    除了对$businessWorker->id 进行0,1,2,3的判断,还有其他方法吗

  • henry 2019-01-08

    还有个问题:客户端连通服务器后,我用Gateway::sendToGroup(321, '发送定时信息1');向客户端发送了一两分钟都发送成功,它这个不会掉线吗?是不是在哪里可以设置时间?

  • blogdaren 2019-01-08
    1. 多进程模型,必然是每个进程都会执行一次,这没有什么毛病。如果只想某个进程干活,除了你说的方法,另外就是使用单进程模型。
    2. 不会掉线是因为有心跳机制,这个建议好好看手册。