首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
多进程模型下协程下的server与websocket如何跨进程发送消息
### 问题描述 我在尝试学习官网提供的携程代码时发现了一个问题,我如果使用单进程,进行群发没有任何问题,但是如果我使用多进程模型增加吞吐量,那么我将无法群发到所有客户端,如A用户在第一个进程的ws连接中,b用户在第二个进程的ws连接中,a用户发送消息,只有a进程下的所有用户可达,b进程并不能收到消息,只有单进程模型下我才可以确保都有数据响应,或当我存在独立的工作进程,执行对应任务后要对某ws发送消息,但是无法跨进程操作,我也没有通过table完成这些能力的思路,请指教,非常感谢。 ### Swoole版本,PHP版本,以及操作系统版本信息 php 7.4 swoole 4.8 ubuntu ### 相关代码 ```php use Swoole\Http\Request; use Swoole\Http\Response; use Swoole\WebSocket\CloseFrame; use Swoole\Coroutine\Http\Server; use function Swoole\Coroutine\run; run(function () { $server = new Server('127.0.0.1', 9502, false); $server->handle('/websocket', function (Request $request, Response $ws) { $ws->upgrade(); global $wsObjects; $objectId = spl_object_id($ws); $wsObjects[$objectId] = $ws; while (true) { $frame = $ws->recv(); if ($frame === '') { unset($wsObjects[$objectId]); $ws->close(); break; } else if ($frame === false) { echo 'errorCode: ' . swoole_last_error() . "\n"; $ws->close(); break; } else { if ($frame->data == 'close' || get_class($frame) === CloseFrame::class) { unset($wsObjects[$objectId]); $ws->close(); break; } foreach ($wsObjects as $obj) { $obj->push("Server:{$frame->data}"); } } } }); $server->start(); }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 我希望可以跨进程发送消息,就如同异步。
发布于3年前 · 26 次浏览 · 来自
提问
QAQ
### 问题描述 我在尝试学习官网提供的携程代码时发现了一个问题,我如果使用单进程,进行群发没有任何问题,但是如果我使用多进程模型增加吞吐量,那么我将无法群发到所有客户端,如A用户在第一个进程的ws连接中,b用户在第二个进程的ws连接中,a用户发送消息,只有a进程下的所有用户可达,b进程并不能收到消息,只有单进程模型下我才可以确保都有数据响应,或当我存在独立的工作进程,执行对应任务后要对某ws发送消息,但是无法跨进程操作,我也没有通过table完成这些能力的思路,请指教,非常感谢。 ### Swoole版本,PHP版本,以及操作系统版本信息 php 7.4 swoole 4.8 ubuntu ### 相关代码 ```php use Swoole\Http\Request; use Swoole\Http\Response; use Swoole\WebSocket\CloseFrame; use Swoole\Coroutine\Http\Server; use function Swoole\Coroutine\run; run(function () { $server = new Server('127.0.0.1', 9502, false); $server->handle('/websocket', function (Request $request, Response $ws) { $ws->upgrade(); global $wsObjects; $objectId = spl_object_id($ws); $wsObjects[$objectId] = $ws; while (true) { $frame = $ws->recv(); if ($frame === '') { unset($wsObjects[$objectId]); $ws->close(); break; } else if ($frame === false) { echo 'errorCode: ' . swoole_last_error() . "\n"; $ws->close(); break; } else { if ($frame->data == 'close' || get_class($frame) === CloseFrame::class) { unset($wsObjects[$objectId]); $ws->close(); break; } foreach ($wsObjects as $obj) { $obj->push("Server:{$frame->data}"); } } } }); $server->start(); }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 我希望可以跨进程发送消息,就如同异步。
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2022-12-08
Rango
多进程没有太好的办法,可以使用 `UnixSocket` 实现进程间通信来解决。 不过与其用 `UnixSocket` 做 `IPC`,到不如一开始就把你的通信服务器设计成分布式的,集群化处理。有专门的转发服务器,来实现消息的中转。
赞
0
回复
2022-12-09
sff
可以使用 (异步风格)服务端
赞
0
回复