Ratchet / ReactPHP循环可以监听多个端口吗?

时间:2017-07-28 09:04:47

标签: php ratchet reactphp

我已将ReactPHP设置为WebSocket侦听器,因此我可以向订阅的浏览器发送近实时更新。它看起来像这样:

if (a >= 0.9999)
    intValue = 1;
else
    intValue = 0;

除了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(); 之外的所有类都是Ratchet的一部分,Listener是我Listener的处理程序实现,它响应连接WebSockets的打开/关闭/错误事件

我希望这个脚本可以通过我正在构建的队列系统联系,因为这是一个系统通道,我想在不同的端口上公开它,以便无法从Internet访问它。这理想情况下是在HTTP而不是WebSocket上;我已成功使用PHP WebSocket客户端联系此侦听器,但与\Ratchet\MessageComponentInterface调用相比,这有点复杂!

猜测,React的内部循环(例如file_get_contents('http://...'))仅在短时间内阻塞(see here),因此它感觉可以管理一些在内部分开流。理想情况下,我希望额外的端口由一个单独的侦听器处理,以实现安全隔离(如果Guzzle中的一个漏洞可能允许攻击者看起来来自受限制的端口,实际上他们来自互联网端口)。

我认为这不是一个不寻常的要求,但在文档中似乎没有任何相关信息,GitHub问题在这里也很明显。如果没有设置并行进程或多线程,这种配置是否可行?

此问题的一个解决方案是在WebSocket侦听器中为特定的消息类型添加IP白名单。我可以在短期内这样做,但是听另一个端口将是更好的解决方案。

1 个答案:

答案 0 :(得分: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();
相关问题