【问题标题】:Best practice when using websockets?使用 websockets 时的最佳实践?
【发布时间】:2013-09-28 18:53:30
【问题描述】:

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

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

【问题讨论】:

  • 希望您能收到更多回复。我开始了用 laravel 实现 websockets 的旅程;我知道的很少,但我的搜索仍在继续。
  • 一定让我更新!
  • 好吧,绝对不要使用 BrainSockets。他们说他们在v1.0,但是服务器不可能推送。当我尝试另一个套接字插件时,我会回来查看。

标签: laravel laravel-4 zeromq phpwebsocket ratchet


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多