2013-09-23 2 views
27

J'ai une application web écrite en Laravel 4. Cette application utilise Ratchet et pour être plus spécifique, elle utilise le paquet Latchet. En tant que sidenote J'utilise les techniques suivantes:Meilleure pratique lors de l'utilisation de Websockets?

Maintenant, je suis arrivé le scénario suivant:

  • J'ai un diaporama qui devrait recevoir des mises à jour via le WebSocket.
  • L'ensemble de l'application est configuré et je peux publier de nouveaux changements de code de PHP vers mes clients websocket via ZeroMq.
  • Dans mon routes.php, j'ai le code suivant, de sorte qu'un sujet est correctement enregistré:

    //routes.php 
    // Setup a connection and register a topic where clients can connect to. 
    Latchet::connection('Connection'); 
    Latchet::topic('PhotoStream/{client}', 'PhotoStreamController'); 
    
  • Ensuite, je commence le serveur à cliquet.

sudo php artisan latchet:listen

Lorsqu'une photo se téléchargé, je puis exécutez le code suivant pour pousser les mises à jour aux clients qui écoutent mon sujet (PhotoStream/client1 dans ce cas):

// Create the object, save it to db and then publish it to my websockets 
$photo = new Photo; 
$photo->location = 'path/to/file'; 
$photo->save(); 
// Publish it through my websocket clients. (push from server). 
Latchet::publish('PhotoStream/client1', array('msg' => $photo->toArray())); 

Ce code fonctionne, mais c'est en cas de mise à jour. Ma question est la suivante:

Comment dois-je gérer l'initialisation du client? Dois-je d'abord rendre la page avec du vieux PHP et ensuite initialiser mon client websocket qui recevra ensuite d'autres mises à jour (s'il y en a) ?.

  • Ou devrais-je, lors de l'enregistrement d'un nouveau client websocket, donner un paramètre supplémentaire à la requête pour que le serveur m'envoie les données complètes via les Websockets? La dernière des deux options semble la meilleure option pour moi mais je ne sais pas vraiment comment la mettre en œuvre dans le bon sens.

  • +0

    Je souhaite que vous ayez plus de réponses. Je commence mon voyage en implémentant websockets avec laravel; Je sais peu mais ma recherche continue. –

    +0

    Certainement me tenir au courant! –

    +0

    Eh bien, n'utilisez pas BrainSockets. Ils disent qu'ils sont à la v1.0, mais il est impossible pour le serveur de pousser. Je reviendrai quand j'essaierai un autre plugin de socket. –

    Répondre

    5

    Du côté javascript (pour récupérer la liste initiale):

    //session.subscribe(....) 
    
    session.call('route/to/controller', arg1, arg2).then(function(res) { 
        console.log(res) //initial collection of photos 
    }); 
    

    Du côté php (pour récupérer la liste initiale):

    public function call($connection, $id, $topic, $params) { 
        //the id is needed to be able to trace your async calls back to the right promise 
        $connection->callResult($id, $this->getInitialPhotosFilteredByParams($params)); 
    }); 
    

    Puisque vous les mises à jour déjà obtenu avec succès via la souscription, c'est tout ce dont tu as besoin. Attention cependant à xss, les params pourraient ne pas être filtrés.

    0

    Si vous avez compris votre question de la bonne façon, voici ce que cela signifie: Vous vous demandez si l'envoi d'images sur le WebSocket est une bonne idée si ces images peuvent également être préchargées sous PHP.

    Je vous suggère d'utiliser PHP pour précharger les images sans utiliser la prise Web et commencer à utiliser le socket une fois les nouvelles images ajoutées. De cette façon, l'utilisateur devrait voir les images à partir du moment où la page est chargée et il n'aura pas à attendre que la connexion websocket soit établie.

    Si vous préférez faire le chargement sur le socket, je vous suggère quand même de charger les premières images du curseur, qui peuvent être vues immédiatement, depuis PHP. Sinon, l'utilisateur devra attendre plus longtemps (notez-le bien, mais notablement plus longtemps).