Meilleure pratique lors de l'utilisation de websockets?
J'ai une application web écrite dans Laravel 4. Cette application fait usage de Ratchet et pour être plus précis, il utilise le paquet Latchet. En tant que sidenote, j'utilise les techniques suivantes:
Maintenant j'ai le scénario suivant:
- j'ai un diaporama qui devrait recevoir les mises à jour par l'intermédiaire du websocket.
- toute l'application est configurée et je peux publier de nouveaux changements de code de PHP vers mes clients websocket via ZeroMq.
dans Mes Itinéraires.php, j'ai le code suivant, de sorte qu'un sujet est enregistré correctement :
//routes.php // Setup a connection and register a topic where clients can connect to. Latchet::connection('Connection'); Latchet::topic('PhotoStream/{client}', 'PhotoStreamController');
ensuite, je démarre le serveur ratchet.
sudo php artisan latchet:listen
quand une photo est téléchargée, je peux alors lancer le code suivant pour pousser les mises à jour aux clients qui sont à l'écoute de 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 il est en cas de mise à jour. Ma question est comme suit:
Comment dois-je traiter l'initialisation du client?
- est-ce que je dois d'abord rendre la page avec un simple Vieux PHP et ensuite initialiser mon client websocket qui reçoit ensuite d'autres mises à jour (s'il y en a)?.
- Ou dois-je, lorsque j'enregistre un nouveau client websocket, donner un paramètre supplémentaire avec la requête pour que le serveur m'envoie les données complètes par le biais de websockets?
cette dernière option me semble la meilleure, mais je ne sais pas comment la mettre en oeuvre de façon satisfaisante.
2 réponses
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é de 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));
});
si vous avez bien compris votre question, c'est celle-ci: vous vous demandez si l'envoi d'images sur le web est une bonne idée si ces images peuvent aussi être préchargées de PHP.
je vous suggérerais D'utiliser PHP pour précharger les images sans utiliser le websocket et de commencer à utiliser la socket une fois que de nouvelles images sont ajoutées.
de cette façon l'utilisateur devrait voir les images à partir du moment où la page est chargée et ils n'auront pas à attendre la connexion websocket être mis en place.
si vous préférez charger sur la socket, je vous suggère de charger les premières images du slider, qui peuvent être vues immédiatement, à partir de PHP. Sinon, l'utilisateur devra attendre plus longtemps(à noter que beaucoup, mais nettement plus long encore).