0

我已将 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 白名单。我可能会在短期内这样做,但在另一个端口上监听会是更好的解决方案。

4

1 回答 1

1

我找到了一种方法,它可能不是最佳实践,但您可以手动添加套接字,如下所示:

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Listener;
use React\Socket\Server as Reactor;

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Listener()
        )
    ),
    8081 //Port 1
);
$socket = new Reactor($server->loop);
$socket->listen(8082, '0.0.0.0'); //Port 2
$socket->on('connection', [$server, 'handleConnect']);
$server->run();
于 2017-07-28T09:33:27.970 回答