Лучшая практика при использовании веб-сокетов?

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

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

  • У меня есть слайд-шоу, которое должно получать обновления через веб-сокет.
  • Все приложение настроено, и я могу публиковать новые изменения кода с PHP на своих клиентах веб-сокетов через ZeroMq.
  • В моем route.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, а затем инициализировать мой клиент веб-сокета, который затем получает дальнейшие обновления (если они есть)?
  2. Или я должен, когда я регистрирую новый клиент веб-сокета, указать дополнительный параметр с запросом, чтобы сервер отправлял мне полные данные через веб-сокеты?

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


person Jack Sierkstra    schedule 23.09.2013    source источник
comment
Я хочу, чтобы вы получили больше ответов. Я начинаю свой путь по внедрению веб-сокетов с помощью laravel; Я мало что знаю, но мои поиски продолжаются.   -  person Andrew Allbright    schedule 28.08.2014
comment
Обязательно держи меня в курсе!   -  person Jack Sierkstra    schedule 28.08.2014
comment
Ну, определенно не используйте BrainSockets. Они говорят, что они в версии 1.0, но сервер не может их протолкнуть. Я вернусь, когда попробую другой плагин для сокетов.   -  person Andrew Allbright    schedule 31.08.2014


Ответы (2)


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

//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, параметры могут не фильтроваться.

person Eelke van den Bos    schedule 21.02.2014

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

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

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

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

person mitchken    schedule 10.05.2016