我已经将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白名单。我可能会在短期内这样做,但在另一个港口倾听会是更好的解决方案。
我还没有机会尚未尝试这一点,但有用的提示[进来从GitHub](https://github.com/ratchetphp/Ratchet/issues/546#issuecomment-327245328)。如果有人试过这个,请告诉我你是怎么做的! – halfer