我得到了一个用Laravel 4编写的web应用程序。这个应用程序使用了Ratchet,更具体地说,它使用了包Latchet。作为旁注,我使用以下技术:
现在我得到了以下情况:
在我的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() ));
此代码全部有效,但是在更新的情况下。我的问题如下:
我应该如何处理客户端的初始化?
这两个选项中的后一个对我来说似乎是最好的选择,但我真的不知道如何以一种好的方式实现它。
答案 0 :(得分:5)
在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,params可能不会被过滤。
答案 1 :(得分:0)
如果以正确的方式理解你的问题就是这样:你想知道如果这些图像也可以通过PHP预加载,是否通过websocket发送图像是个好主意。
我建议您使用PHP在不使用websocket的情况下预加载图像,并在添加新图像后开始使用套接字。
这样,用户应该在页面加载时看到图像,并且不必等待建立websocket连接。
如果你喜欢在套接字上加载,我仍然建议你从PHP中加载滑块中的前几个图像,这些图像可以立即看到。否则,用户将不得不等待更长时间(注意那么多,但仍然明显更长)。