2013-09-23 18 views
27

Ho un'applicazione web scritta in Laravel 4. Questa applicazione utilizza Ratchet e per essere più specifica utilizza il pacchetto Latchet. Come sidenote sto utilizzando le seguenti tecniche:La migliore pratica quando si utilizzano websockets?

Ora ho il seguente scenario:

  • Ho una presentazione che dovrebbe ricevere aggiornamenti tramite il websocket.
  • L'intera applicazione è impostata e posso pubblicare nuove modifiche al codice da PHP ai miei client Websocket tramite ZeroMq.
  • Nel mio routes.php, ho il seguente codice, in modo che un argomento è registrato correttamente:

    //routes.php 
    // Setup a connection and register a topic where clients can connect to. 
    Latchet::connection('Connection'); 
    Latchet::topic('PhotoStream/{client}', 'PhotoStreamController'); 
    
  • Poi, ho avviare il server cricchetto.

sudo php artisan latchet:listen

Quando una foto viene caricato, posso quindi eseguire il seguente codice per spingere gli aggiornamenti ai client in ascolto al mio argomento (PhotoStream/client1 in questo caso):

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

Questo codice funziona tutto, ma è in caso di un aggiornamento. La mia domanda è la seguente:

Come devo gestire l'inizializzazione del client?

  1. Devo prima il rendering della pagina con la pianura vecchio PHP e poi inizializzare il mio cliente websocket che poi ricevere ulteriori aggiornamenti (se ce ne sono) ?.
  2. O dovrei, quando registro un nuovo client websocket, fornire un parametro aggiuntivo con la richiesta in modo che il server mi invii i dati completi tramite websocket?

Quest'ultima opzione sembra l'opzione migliore per me, ma non so davvero come implementarla in modo corretto.

+0

Vorrei avere più risposte. Sto iniziando il mio viaggio implementando websockets con laravel; Conosco poco ma la mia ricerca continua. –

+0

Sicuramente tienimi aggiornato! –

+0

Beh, sicuramente non usare BrainSockets. Dicono che sono alla v1.0, ma è impossibile che il server lo spinga. Controllerò quando provo un altro plug-in per socket. –

risposta

5

Sul lato javascript (per recuperare lista iniziale):

//session.subscribe(....) 

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

Sul lato php (per recuperare lista iniziale):

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

Dal momento che avete già ottenuto con successo gli aggiornamenti tramite la sottoscrizione, questo è tutto ciò di cui hai bisogno. Attenzione però per xss, i parametri potrebbero non essere filtrati.

0

Se hai capito la tua domanda nel modo giusto è questo: ti stai chiedendo se l'invio di immagini tramite il web-socket è una buona idea se quelle immagini potrebbero anche essere precaricate da PHP.

Vorrei suggerire di utilizzare PHP per precaricare le immagini senza utilizzare la websocket e iniziare a utilizzare la presa una volta che sono state aggiunte nuove immagini.

In questo modo l'utente dovrebbe vedere le immagini dal momento in cui la pagina viene caricata e non dovranno aspettare che venga stabilita la connessione web socket.

Se si preferisce eseguire il caricamento tramite socket, suggerisco comunque di caricare le prime immagini dal dispositivo di scorrimento, che può essere visualizzato immediatamente, da PHP. In caso contrario, l'utente dovrà attendere più a lungo (notare che molto, ma notevolmente più lungo ancora).

Problemi correlati