首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
多进程的协程websocket服务端如何获取其他进程的wsObjects
### 问题描述 我现在使用的是多进程+ websocket协程服务端, A,B,C,D四个进程,每个进程都有单独的 $wsObjects, 请问如果在B 里面获取A里面的$wsObjects ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.4 php7.4 ### 相关代码 ```php $workerNum = swoole_cpu_num(); $pool = new \Swoole\Process\Pool($workerNum,SWOOLE_IPC_UNIXSOCK,0,true); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started\n"; //每个进程都监听9504端口 $server = new \Co\Http\Server("0.0.0.0", '9501', false, true); //收到15信号关闭服务 pcntl_signal(SIGTERM, function () use ($server) { $server->shutdown(); }); //监听全网段地址、端口 $server->handle('/websocket', function ($request, $ws) use ($workerId,$pool) { $ws->upgrade();//向客户端发送websocket握手信息 global $wsObjects; $objectId = spl_object_id($ws); $wsObjects[$objectId] = $ws; $cid = \Co::getCid(); echo "Client: {$cid } connect\n"; while (true) { $frame = $ws->recv(); if ($frame === '' || $frame->data == 'close' || get_class($frame) === \Swoole\WebSocket\CloseFrame::class) { echo "Client: {$cid} close\n"; unset($wsObjects[$objectId]); $ws->close(); break; } else if ($frame === false) { echo 'error : ' . swoole_last_error() . "\n"; break; } else { echo "receive from {$cid}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $args = json_decode($frame->data,true); } } }); $server->start(); }); $pool->on("WorkerStop", function ($pool, $workerId) { echo "Worker#{$workerId} is stopped\n"; }); $pool->start(); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 能取到另一个进程里面的 $wsObjects 或者$ws对象
发布于3年前 · 6 次浏览 · 来自
提问
偎徕
### 问题描述 我现在使用的是多进程+ websocket协程服务端, A,B,C,D四个进程,每个进程都有单独的 $wsObjects, 请问如果在B 里面获取A里面的$wsObjects ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.4 php7.4 ### 相关代码 ```php $workerNum = swoole_cpu_num(); $pool = new \Swoole\Process\Pool($workerNum,SWOOLE_IPC_UNIXSOCK,0,true); $pool->on("WorkerStart", function ($pool, $workerId) { echo "Worker#{$workerId} is started\n"; //每个进程都监听9504端口 $server = new \Co\Http\Server("0.0.0.0", '9501', false, true); //收到15信号关闭服务 pcntl_signal(SIGTERM, function () use ($server) { $server->shutdown(); }); //监听全网段地址、端口 $server->handle('/websocket', function ($request, $ws) use ($workerId,$pool) { $ws->upgrade();//向客户端发送websocket握手信息 global $wsObjects; $objectId = spl_object_id($ws); $wsObjects[$objectId] = $ws; $cid = \Co::getCid(); echo "Client: {$cid } connect\n"; while (true) { $frame = $ws->recv(); if ($frame === '' || $frame->data == 'close' || get_class($frame) === \Swoole\WebSocket\CloseFrame::class) { echo "Client: {$cid} close\n"; unset($wsObjects[$objectId]); $ws->close(); break; } else if ($frame === false) { echo 'error : ' . swoole_last_error() . "\n"; break; } else { echo "receive from {$cid}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $args = json_decode($frame->data,true); } } }); $server->start(); }); $pool->on("WorkerStop", function ($pool, $workerId) { echo "Worker#{$workerId} is stopped\n"; }); $pool->start(); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 能取到另一个进程里面的 $wsObjects 或者$ws对象
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-12-30
鲁飞
进程间通讯:https://wiki.swoole.com/#/process/process?id=exportsocket 这问题和异步服务器多worker的道理一样。
赞
0
回复
2020-12-30
偎徕
回复
鲁飞
请问 swoole\table 直接存储$ws 对象吗. 我现在存进去了,取出来无法push. swooe\table设置多少行呢, 最大行数吗
赞
0
回复
微信公众号
热门内容
作者其它话题
- swoole websocket协程服务端 出现过多CLOSE_WAIT
- swoole websocket协程服务端 因为客户端连接数量过多崩溃
- swoole 协程内存消息
- websocket协程服务端如何和客户端如何在同一个协程里面维持连接
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。