28

我有一个用 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 向我发送完整的数据?

这两个选项中的后者对我来说似乎是最好的选择,但我真的不知道如何以一种好的方式实现它。

4

2 回答 2

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,参数可能不会被过滤。

于 2014-02-21T00:36:14.803 回答
0

如果以正确的方式理解您的问题,就是这样:您想知道通过 websocket 发送图像是否是一个好主意,如果这些图像也可以从 PHP 预加载。

我建议您使用 PHP 在不使用 websocket 的情况下预加载图像,并在添加新图像后开始使用套接字。

这样,用户应该从页面加载的那一刻起就可以看到图像,并且他们不必等待 websocket 连接建立。

如果您更喜欢通过套接字进行加载,我仍然建议您从滑块加载前几张图像,这可以立即从 PHP 中看到。否则用户将不得不等待更长的时间(请注意,但明显更长)。

于 2016-05-10T08:20:12.507 回答