2013-09-23 5 views
27

У меня есть веб-приложение, написанное в Laravel 4. Это приложение использует Ratchet и, если быть более конкретным, оно использует пакет Latchet. Как заметка на полях, я использую следующие методы:Лучшая практика при использовании websockets?

Теперь я получил следующий сценарий:

  • У меня есть слайд-шоу, которое должно получать обновления через websocket.
  • Все приложение настроено, и я могу публиковать новые изменения кода с PHP на своих клиентов в сети через ZeroMq.
  • В моей routes.php, у меня есть следующий код, так что тема зарегистрирован правильно:

    //routes.php 
    // Setup a connection and register a topic where clients can connect to. 
    Latchet::connection('Connection'); 
    Latchet::topic('PhotoStream/{client}', 'PhotoStreamController'); 
    
  • Затем я запустить сервер трещотки.

sudo php artisan latchet:listen

Когда фотография получает загружена, я могу затем запустить следующий код для установки обновлений для клиентов, которые слушают мою тему (PhotoStream/client1 в данном случае):

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

Этот код работает, но в случае обновления. Мой вопрос следующий:

Как я должен обрабатывать инициализацию клиента?

  1. Должен ли я сначала отобразить страницу с простым старым PHP и затем инициализировать мой клиент websocket, который затем получит дополнительные обновления (если они есть) ?.
  2. Или должен ли я, когда я зарегистрирую новый клиент websocket, предоставить дополнительный параметр с запросом, чтобы сервер отправил мне полные данные через websockets?

Последний из двух вариантов представляется мне лучшим вариантом, но я действительно не знаю, как реализовать это в хорошем смысле.

+0

Желаю вам большего ответа. Я начинаю свое путешествие с помощью websockets с laravel; Я мало знаю, но поиск продолжается. –

+0

Определенно держите меня в курсе! –

+0

Ну, определенно не используйте BrainSockets. Говорят, что они на v1.0, но сервер не может нажать. Я вернусь, когда попробую подключиться к другому плагину. –

ответ

5

На яваскрипте стороны (для получения первоначального списка):

//session.subscribe(....) 

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

На стороне PHP (для получения первоначального списка):

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

Так как вы уже успешно получиут обновление через подписку, это все, что вам нужно. Остерегайтесь xss, хотя параметры могут не фильтроваться.

0

Если вы правильно поняли свой вопрос, это он: вам интересно, если отправка изображений через веб-сайт является хорошей идеей, если эти изображения также могут быть предварительно загружены из PHP.

Я предлагаю вам использовать PHP для предварительной загрузки изображений без использования websocket и начнет использовать сокет после добавления новых изображений.

Таким образом, пользователь должен видеть изображения с момента загрузки страницы, и им не придется ждать установления соединения с веб-разъемом.

Если вы предпочитаете выполнять загрузку через сокет, я все же предлагаю вам загрузить первые несколько изображений с ползунка, который можно увидеть сразу, с PHP. В противном случае пользователю придется подождать дольше (обратите внимание, что много, но заметно дольше).

Смежные вопросы