Лучшая практика при использовании веб-карт?
У меня есть веб-приложение, написанное в 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?
Последний из двух вариантов кажется лучшим вариантом для меня, но я действительно не знаю, как реализовать это в хорошем смысле.
Ответы
Ответ 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. В противном случае пользователю придется подождать дольше (обратите внимание, что много, но заметно дольше).