在ReactPHP中,我可以获取连接本地端口的端口号吗?

时间:2017-08-05 16:07:15

标签: php guzzle reactphp tcp-port

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

1 个答案:

答案 0 :(得分:0)

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

我懒得思索这些信息是否可能位于Ratchet\Server\IoServer服务器实例中,所以我在开始循环之前将其注入我的监听器,并再次使用print_r()进行检查。同样的结果,我害怕;没有什么能看起来很有用。

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

version 0.4可能会支持此功能,因此我会在升级时重新访问。