websocket 如何投递消息到 http

34 天前
 v2li32

我在构思微服务下如何通过 websocket 作为交互。

运行流程

client => http => server => ws/tcp => server2 收到 => server2 通过 unixsocket 投递消息到 work 处理完成后 => 通过 ws 写消息回去 => server 的 ws 收到消息

这个时候 如果正常处理 加工收到的消息, 写入消息到 client 的 fd,close 掉 client 连接 应该是可行的。

平常业务代码

client => server(伪代码)=> return

<?php

func add(){
	$get= $_REQUEST_PARAMS;
	return success("code=>200,data=$get,msg=''");
}

如果换成上面通过 websocket 交互

都不需要返回了, server 收到 server2 结果后 fwrite($client_fd,$data); close($client_fd);

<?php

func add(){
	$get= $_REQUEST_PARAMS;
    (new Ws)->send($get);
}

上面写好奇怪的样子。。 我想实现下面的写法有办法吗(代码直观看着舒服),比如

<?php

func add(){
	$get= $_REQUEST_PARAMS;
    $res = (new Ws)->send($get);

    return success("code=>200,data=$res,msg=''");
}

如果想实现上面这样子,需要在加一个队列(起到 while true 阻塞效果?)。

开辟 1 片内存 $arr[$client_fd] => $data; 数据回来后写入。然后 pop 消息。

这样子就好像成 select 了。。 无时无刻在遍历,有数据在返回,性能问题很大。。

然后好像为了解决问题又引入新的问题。

大佬们给点思路呢

733 次点击
所在节点   WebSocket
7 条回复
RedBeanIce
34 天前
请直接说,你在做什么,想实现什么目标。
sentinelK
34 天前
需要楼主提炼一下问题。
1 、问题只问核心就行了,不需要掺杂业务。
2 、目前你遇到的问题是什么?
3 、“写着舒服”是个什么概念?
tool2dx
34 天前
我猜测一下,OP server1 要返回客户端的 http 请求,但是内容是来自于 server2 。

而 server2 -> server1 是用 websocket 协议通讯。

所以 OP 说,server1 就需要傻等 server2 返回的结果,用 whire true 卡住 CPU ,死等??
v2li32
34 天前
@tool2dx 是的。这个如何解决呢。while true 太不优雅了
tool2dx
34 天前
@v2li32 JS 都是异步回调,php 没用过不太清楚。
v2li32
34 天前
@tool2dx js 的怎么个异步法呢,比如 node, server 回来的 ws 数据跟 客户的 client 他们没有桥梁。 所以才想到搞一个队列阻塞 被动查询是否有数据。
julyclyde
34 天前
按说 HTTP upgrade 之后就不能再 downgrade 了吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1040165

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX