首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
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(); }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 我希望可以跨进程发送消息,就如同异步。
发布于1年前 · 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
回复
微信公众号
热门内容
作者其它话题
- 关于swoole异步服务器与table多进程下并发读写的问题
暂无回复的问答
- 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一直是同一个。没用使用到多进程啊。