Подтвердить что ты не робот

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

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

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

  • У меня есть слайд-шоу, которое должно получать обновления через websocket.
  • Все приложение настроено, и я могу публиковать новые изменения кода с 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() ));

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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