0

我在 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。

4

1 回答 1

0

我目前对此的回答是这是不可能的,至少在我使用的 Ratchet 版本中是不可能的。我已经扫描$from了,这似乎只是从外部角度了解端口。我可以在内部端口中找到的唯一引用print_r($from)是我在手动映射数组中设置的引用,这没有帮助。

我漫不经心地思考这些信息是否可能存在于Ratchet\Server\IoServer服务器实例中,所以我在开始循环之前将它注入到我的侦听器中,并print_r()再次检查它。恐怕同样的结果;没有什么看起来有用。

与原始帖子相反,我的端口映射现在设置在一个docker-compose.yml文件中,所以我现在的解决方案是将这些映射添加到同一个文件中的环境变量中,这样它们就更难不同步了。我不想硬连线这些,因为我根据环境使用不同的端口映射。

0.4版本可能会支持这个,所以我会在升级时重新访问。

于 2017-10-23T14:05:12.297 回答