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