2017-07-28 2 views
0

Ich habe ReactPHP als WebSocket-Listener eingerichtet, sodass ich nahezu Echtzeit-Updates für abonnierte Browser senden kann. Es sieht wie folgt aus:Kann eine Ratchet/ReactPHP-Schleife mehr als einen Port hören?

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

Alle diese Klassen mit Ausnahme Listener Teil von Ratchet sind, und die Listener ist meine Handler Implementierung von \Ratchet\MessageComponentInterface, die auf die Öffnen/Schließen/Fehlerereignisse von Verbindungs ​​WebSockets reagiert.

Ich möchte, dass dieses Skript von einem Warteschlangensystem, das ich erstelle, kontaktierbar ist, und da dies ein Systemkanal ist, möchte ich dies an einem anderen Port anzeigen, so dass es nicht aus dem Internet erreichbar ist. Dies wäre idealerweise auf HTTP statt WebSocket; Ich habe erfolgreich einen PHP WebSocket-Client verwendet, um diesen Listener zu kontaktieren, aber das ist ein bisschen kompliziert im Vergleich zu einem file_get_contents('http://...') Aufruf!

Bei einer Vermutung, die interne Schleife von React (z.B. StreamSelectLoop::streamSelect) blockiert nur für kurze Zeit (see here), so dass es fühlt möglich, dass es im Innern eine Anzahl von getrennten Strömen verwalten könnte. Im Idealfall möchte ich, dass der zusätzliche Port von einem separaten Listener verwaltet wird, um die Sicherheit zu isolieren (falls es in Guzzle möglich ist, dass ein Angreifer scheinbar aus dem eingeschränkten Port kommt, obwohl er tatsächlich aus dem Internet kam) Hafen).

Ich denke, dies ist keine ungewöhnliche Anforderung, aber es scheint keine verwandten Informationen in den Dokumenten zu sein, und die GitHub-Probleme sind auch hier ziemlich kahl. Ist diese Konfiguration möglich, ohne parallele Prozesse oder Multithreading einzurichten?

Eine Lösung für dieses Problem ist das Hinzufügen von IP-Whitelisting im WebSocket-Listener für bestimmte Nachrichtentypen. Ich könnte das kurzfristig tun, aber auf einen anderen Port zu hören, wäre eine viel bessere Lösung.

+0

Ich habe keine Gelegenheit gehabt dies noch zu versuchen, aber ein wertvoller Hinweis [kommt in von GitHub] (https://github.com/ratchetphp/Ratchet/issues/546#issuecomment-327245328). Wenn jemand dies versucht, lass es mich wissen, wie es dir geht! – halfer

Antwort

1

fand ich einen Weg, kann es nicht eine beste Praxis sein, aber Sie können manuell Sockel hinzufügen, wie folgt aus:

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

Ooh wow, danke. Ich werde es versuchen! – halfer

+0

Richtig, das ist ein guter Anfang, danke. Ich konnte keine Klasse mit dem Namen 'Reactor' finden, aber sie scheint in der Ratchet-Quelle als Alias ​​für' React \ Socket \ Server' verwendet zu werden, also habe ich das als 'use' hinzugefügt und der Server wurde gestartet. Es hört nun beide Ports ab und leitet sie an denselben Handler weiter. Das hat mich in eine bessere Position gebracht, da ich jetzt die Port-Details im 'Listener' zur Sicherheitsfilterung lesen kann. – halfer

+0

Was ich jedoch wirklich gerne hätte, wäre den zweiten Port und einen komplett separaten Handler hinzufügen zu können, also gibt es eine Trennung zwischen den beiden Ports. Ich möchte den zweiten Server als reguläres HTTP statt als WebSocket einrichten. Glaubst du, das ist möglich? Ich habe ReactPHP noch nicht richtig verstanden. – halfer

Verwandte Themen