Я использую ReactPHP в среде Docker для прослушивания сообщений 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, чтобы различать интернет-запросы WebSocket и личные сообщения из других контейнеров в частной сети Docker. Итак, чтобы определить порт, я делаю это (используя объект Guzzle, настроенный выше):
$request->getPort();
Однако это дает мне 10002 (интернет-порт), а не внутренний порт на стороне контейнера (8081). У меня есть картографическое устройство, чтобы найти ассоциацию, но могу ли я получить порт контейнера напрямую?
Я использую Ratchet 0.36.
Мой текущий ответ на это таков: это невозможно, по крайней мере, с версией Ratchet, которую я использую. Я отсканировал $from
и это только кажется, что знает о порте с внешней точки зрения. Единственные ссылки, которые я могу найти в print_r($from)
к внутреннему порту есть те, которые я установил в массиве ручного отображения, что не помогает.
Я лениво думал, может ли эта информация сидеть в Ratchet\Server\IoServer
экземпляр сервера, поэтому я вставил это в мой слушатель перед запуском цикла и исследовал его print_r()
снова. Боюсь, результат тот же; ничто не выскакивает как выглядящий полезным.
Вопреки оригинальному сообщению, мои отображения портов теперь настроены в docker-compose.yml
файл, поэтому мое решение сейчас будет добавить эти сопоставления в переменные окружения в одном файле, поэтому им труднее выйти из синхронизации. Я не хочу использовать их, поскольку я использую различные сопоставления портов в зависимости от среды.
Возможно, что версия 0.4 будет поддерживать это, поэтому я вернусь при обновлении.
Других решений пока нет …