我在Docker环境中运行ReactPHP来侦听WebSocket消息。我使用端口映射功能如下:
docker run \
--detach \
-p 10002:8081 \
missive-controller
因此,外部端口10002映射到容器内的8081。
在MessageComponentInterface
的实现中,我有这个事件处理程序:
public function onMessage(ConnectionInterface $from, $msg)
{
echo sprintf(
"Connection %d sent message \"%s\" to WS server\n",
$from->resourceId,
$msg
);
/* @var $request \Guzzle\Http\Message\EntityEnclosingRequest */
$request = $from->WebSocket->request;
// ... do stuff
}
现在,我正在侦听ReactPHP中的几个端口,以区分Internet WebSocket请求和私有Docker网络上其他容器的私有消息。因此,为了检测端口,我这样做(使用上面设置的Guzzle对象):
$request->getPort();
然而,这让我得到10002(互联网端口)而不是内部容器端口(8081)。我现在有一个映射设备来查找关联,但是我可以直接获得容器端口吗?
我正在使用Ratchet 0.36。
答案 0 :(得分:0)
我现在对此的回答是,这是不可能的,至少我使用的是棘轮版本。我扫描了$from
,这似乎只是从外部角度了解端口。我在内部端口的print_r($from)
中找到的唯一引用是我在手动映射数组中设置的引用,但没有帮助。
我懒得思索这些信息是否可能位于Ratchet\Server\IoServer
服务器实例中,所以我在开始循环之前将其注入我的监听器,并再次使用print_r()
进行检查。同样的结果,我害怕;没有什么能看起来很有用。
与原始帖子相反,我的端口映射现在设置在docker-compose.yml
文件中,所以我现在的解决方案是在同一文件中的环境变量中添加这些映射,因此对它们来说更难变得不同步我不想硬连接这些,因为我根据环境使用不同的端口映射。
version 0.4可能会支持此功能,因此我会在升级时重新访问。