2013-09-23 39 views
27

Mam aplikację internetową napisaną w Laravel 4. Ta aplikacja korzysta z Ratchet i aby być bardziej szczegółowym, używa pakietu Latchet. Jak sidenote Używam następujących technik:Najlepsza praktyka podczas korzystania z websockets?

Teraz mam następujący scenariusz:

  • mam pokaz slajdów, który powinien otrzymywać aktualizacje za pośrednictwem websocket.
  • Cała aplikacja jest skonfigurowana i mogę publikować nowe zmiany kodu z PHP na moich klientach websocket poprzez ZeroMq.
  • W moim routes.php, mam następujący kod tak, że temat jest zarejestrowany poprawnie:

    //routes.php 
    // Setup a connection and register a topic where clients can connect to. 
    Latchet::connection('Connection'); 
    Latchet::topic('PhotoStream/{client}', 'PhotoStreamController'); 
    
  • Potem uruchomić serwer zapadkowy.

sudo php artisan latchet:listen

Gdy zdjęcie zostanie przesłany, mogę następnie uruchom następujący kod do pchania aktualizacje do klientów, którzy słuchają mojego tematu (PhotoStream/client1 w tym przypadku):

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

Ten kod działa, ale jest w przypadku aktualizacji. Moje pytanie jest następujące:

Jak powinienem obsłużyć inicjalizację klienta?

  1. Czy powinienem najpierw renderować stronę ze zwykłym starym PHP, a następnie zainicjować mojego klienta websocket, który następnie otrzyma dalsze aktualizacje (jeśli takie istnieją) ?.
  2. Czy powinienem, po zarejestrowaniu nowego klienta sieci web, podać dodatkowy parametr z żądaniem, aby serwer przesyłał mi kompletne dane za pośrednictwem stron internetowych?

Ta ostatnia z dwóch opcji wydaje mi się najlepszą opcją, ale tak naprawdę nie wiem, jak ją wdrożyć w dobry sposób.

+0

Życzę więcej odpowiedzi. Rozpoczynam moją podróż od implementowania websockets z laravel; Niewiele wiem, ale moje poszukiwania trwają. –

+0

Zdecydowanie bądź na bieżąco! –

+0

Zdecydowanie nie korzystaj z BrainSockets. Mówią, że są na v1.0, ale serwer nie może pchnąć. Sprawdzę, kiedy spróbuję wtyczki innej wtyczki. –

Odpowiedz

5

Javascript stronie (aby pobrać wstępną listę):

//session.subscribe(....) 

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

Na stronie php (aby pobrać wstępną listę):

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

Skoro już z powodzeniem zdobyć aktualizacji poprzez subskrypcję, to wszystko, czego potrzebujesz. Uważaj jednak na xss, parametry mogą nie być filtrowane.

0

Jeśli zrozumiałeś swoje pytanie we właściwy sposób, to jest to: Zastanawiasz się, czy wysyłanie obrazów za pomocą websocket jest dobrym pomysłem, jeśli obrazy te mogą być również wstępnie załadowane z PHP.

Proponuję, abyś użył PHP do wstępnego załadowania obrazów bez użycia websocket i zacząłby używać gniazda po dodaniu nowych zdjęć.

W ten sposób użytkownik powinien widzieć obrazy od momentu załadowania strony i nie będzie musiał czekać na nawiązanie połączenia internetowego.

Jeśli wolisz ładować przez gniazdo, nadal sugerowałbym załadować kilka pierwszych obrazów z suwaka, które można zobaczyć natychmiast, z PHP. W przeciwnym razie użytkownik będzie musiał poczekać dłużej (zauważ, że dużo, ale zauważalnie dłużej).