2017-07-28 1 views
0

J'ai configuré ReactPHP en tant qu'écouteur WebSocket afin de pouvoir envoyer des mises à jour en temps quasi réel aux navigateurs abonnés. Il ressemble à ceci:Une boucle Ratchet/ReactPHP peut-elle écouter plusieurs ports?

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

Toutes ces classes, sauf pour Listener font partie de Ratchet et le Listener est ma mise en œuvre de gestionnaire de \Ratchet\MessageComponentInterface, qui répond aux événements d'ouverture/fermeture/d'erreur de WebSockets connexion. Je voudrais que ce script puisse être contacté par un système de file d'attente que je construis, et comme c'est un canal système, je voudrais l'exposer sur un autre port afin qu'il ne soit pas accessible depuis Internet. Idéalement, ce serait sur HTTP plutôt que sur WebSocket; J'ai réussi à utiliser un client PHP WebSocket pour contacter cet auditeur, mais c'est un peu compliqué par rapport à un appel file_get_contents('http://...')!

A une supposition, la boucle interne de React (par exemple StreamSelectLoop::streamSelect) ne bloque que pour une courte durée (see here) il sent possible qu'il puisse gérer plusieurs flux séparés en interne. Idéalement, je voudrais que le port supplémentaire soit géré par un auditeur séparé, pour l'isolation de la sécurité (dans le cas où une faille dans Guzzle pourrait permettre à un attaquant de sortir du port restreint alors qu'en fait ils viennent d'internet Port).

Je pense que ce n'est pas une exigence inhabituelle, mais il ne semble pas y avoir d'informations connexes dans les documents, et les problèmes de GitHub sont plutôt nus ici aussi. Cette configuration est-elle possible sans configuration de processus parallèles ou multithreading?


Une solution à ce problème consiste à ajouter une liste blanche IP dans le port d'écoute WebSocket pour des types de message spécifiques. Je peux le faire à court terme, mais écouter sur un autre port serait une meilleure solution.

+0

Je n'ai pas eu la chance d'essayer encore, mais un indice précieux [vient en de GitHub] (https://github.com/ratchetphp/Ratchet/issues/546#issuecomment-327245328). Si quelqu'un essaie cela, s'il vous plaît laissez-moi savoir comment vous allez! – halfer

Répondre

1

je trouve une façon, il peut être pas une bonne pratique, mais vous pouvez ajouter manuellement socket, comme ceci:

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 ouah, merci. Je vais essayer ça! – halfer

+0

Bon, c'est un bon début, merci. Je n'ai pas pu trouver une classe appelée 'Reactor', mais elle semble être utilisée dans la source Ratchet comme un alias pour' React \ Socket \ Server', donc j'ai ajouté cela comme 'use' et le serveur a démarré. Il écoute maintenant les deux ports et les dirige vers le même gestionnaire. Cela m'a mis dans une meilleure position, puisque je peux maintenant lire les détails du port dans le 'Listener' pour le filtrage de sécurité. – halfer

+0

Cependant, ce que j'aimerais vraiment, c'est pouvoir ajouter le deuxième port et un gestionnaire entièrement séparé, donc il y a une certaine séparation entre les deux ports. Je voudrais configurer le deuxième serveur en tant que HTTP standard plutôt que WebSocket. Pensez-vous que c'est possible? Je n'ai pas encore vraiment compris ReactPHP. – halfer