使用websockets时的最佳做法?

时间:2013-09-23 18:52:02

标签: laravel laravel-4 zeromq phpwebsocket ratchet

我得到了一个用Laravel 4编写的web应用程序。这个应用程序使用了Ratchet,更具体地说,它使用了包Latchet。作为旁注,我使用以下技术:

现在我得到了以下情况:

  • 我有一个幻灯片,应该通过websocket接收更新。
  • 整个应用程序已设置完毕,我可以通过ZeroMq将新的代码更改从PHP发布到我的websocket客户端。
  • 在我的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向我发送完整的数据?
  3. 这两个选项中的后一个对我来说似乎是最好的选择,但我真的不知道如何以一种好的方式实现它。

2 个答案:

答案 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中加载滑块中的前几个图像,这些图像可以立即看到。否则,用户将不得不等待更长时间(注意那么多,但仍然明显更长)。