2017-07-28 85 views
0

我已经将ReactPHP设置为WebSocket侦听器,因此我可以向订阅的浏览器发送接近实时的更新。它看起来像这样:棘轮/ ReactPHP循环可以侦听多个端口吗?

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这些类是棘轮的一部分,并且Listener是我的处理程序实现\Ratchet\MessageComponentInterface,这是为了响应连接的WebSockets的开启/关闭/错误事件。

我希望这个脚本可以通过我正在构建的队列系统来联系,并且由于这是一个系统通道,所以我想在不同的端口上公开这个脚本,以便它不能从Internet访问。理想情况下,这将在HTTP而不是WebSocket上;我已经成功地使用PHP WebSocket客户端来联系这个监听器,但与file_get_contents('http://...')调用相比,这有点复杂!

在猜测,内部环路阵营(例如StreamSelectLoop::streamSelect)只块短时间(see here),所以它感觉可能的,它可以从内部管理多个单独的流。理想情况下,我希望额外的端口由单独的监听器处理,以便安全隔离(如果Guzzle中的缺陷可能允许攻击者看起来来自限制端口,实际上他们来自Internet港口)。

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


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

+0

我还没有机会尚未尝试这一点,但有用的提示[进来从GitHub](https://github.com/ratchetphp/Ratchet/issues/546#issuecomment-327245328)。如果有人试过这个,请告诉我你是怎么做的! – halfer

回答

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(); 
+0

哦,哇,谢谢。我会试试这个! – halfer

+0

对,这是一个很好的开始,谢谢。我找不到一个名为'Reactor'的类,但它似乎在Ratchet源中用作'React \ Socket \ Server'的别名,所以我添加了'use',服务器启动了。它现在监听两个端口并将它们指向同一个处理程序。这让我处于一个更好的位置,因为我现在可以在'Listener'中读取端口细节以进行安全过滤。 – halfer

+0

但是,我真正喜欢的是能够添加第二个端口和一个完全独立的处理程序,因此两个端口之间会有一些分隔。我想将第二台服务器设置为普通HTTP而不是WebSocket。你认为这是可能的吗?我还没有真正掌握ReactPHP。 – halfer

相关问题