Я настроил ReactPHP в качестве прослушивателя WebSocket, чтобы я мог отправлять обновления почти в реальном времени в подписанные браузеры. Это выглядит так:
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Listener;
$rootPath = realpath(__DIR__ . '/..');
require_once $rootPath . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Listener()
)
),
8081
);
$server->run();
Все эти классы, кроме Listener
, являются частью Ratchet, а Listener
является моей реализацией обработчика \Ratchet\MessageComponentInterface
, который отвечает на события открытия/закрытия/ошибки подключения WebSockets.
Я хотел бы, чтобы этот скрипт был доступен для системы очередей, которую я создаю, и, поскольку это системный канал, я хотел бы выставить его на другом порту, чтобы он был недоступен из Интернета. В идеале это должно быть на HTTP, а не на WebSocket; Я успешно использовал клиент PHP WebSocket для связи с этим слушателем, но это немного сложно по сравнению с вызовом file_get_contents('http://...')
!
Можно предположить, что внутренний цикл React (например, StreamSelectLoop::streamSelect
) блокируется только на короткое время (см. здесь), поэтому чувствуется возможность внутреннего управления несколькими отдельными потоками. В идеале я хотел бы, чтобы дополнительный порт обрабатывался отдельным прослушивателем для изоляции безопасности (на случай, если уязвимость в Guzzle позволяет злоумышленнику выглядеть как исходящий из ограниченного порта, когда на самом деле он пришел из Интернета порт).
Я думаю, что это обычное требование, но похоже, что в документах нет никакой соответствующей информации, и вопросы GitHub здесь тоже довольно голые. Возможна ли такая конфигурация без настройки параллельных процессов или многопоточности?
Одним из решений этой проблемы является добавление белого списка IP-адресов в прослушиватель WebSocket для определенных типов сообщений. Я могу сделать это в краткосрочной перспективе, но прослушивание через другой порт было бы гораздо более приятным решением.