我已将 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 问题在这里也相当简单。这种配置是否可以在不设置并行进程或多线程的情况下进行?
此问题的一种解决方案是在 WebSocket 侦听器中为特定消息类型添加 IP 白名单。我可能会在短期内这样做,但在另一个端口上监听会是更好的解决方案。