2016-11-28 36 views
5

问题标题可能有点混乱,我尽我所能解释它。Laravel Echo重复n次收听活动已广播

我有laravel-echo-server,redis(用于排队)和Laravel echo设置。我想要的只是通过输入发送消息,并为页面上的每个人更新消息源;基本上是一个聊天室。

一切正常,除了它速度缓慢,但我是Laravel EchoVue

如果我发送了一条消息,那很好,但是当我发送另一条消息时,我得到两个响应。发送第三条消息三个响应,等等......

我究竟在做什么错误?我检查过socket.io/laravel-echo-server只连接到通道一次,而我的broadcast只发送一次(检查队列工作者只处理请求),那么它如何以指数形式重复?

这是我app.js

const chatWindow = new Vue({ 
    el: '#chatWindow', 
    data: { 
     messages: [] 
    }, 
    methods: { 
     sendMessage: function() { 
      this.$http.post('/chat', {message: this.message}).then((response) => { 
       window.Echo.channel('test-chat-channel') 
        .listen('MessageSent', (event) => { 
         console.log(event.message); 
         // this.messages.push(event.message); 
        }); 
      }, (response) => { 
       // error callback 
      }); 

      this.message = ''; 
     } 
    }, 
    props: ['message'] 
}); 

这是我聊天视图

<div id="chatWindow" class="col-sm-7"> 
    <h1 class="text-center no-top">Chat</h1> 
    <div class="chat-window"> 
     <ul> 
      <li v-for="message in messages">@{{ message }}</li> 
     </ul> 

     <div class="form-group"> 
      <input title="Send Message" v-model="message" @keyup.enter="sendMessage" class="form-control" placeholder="Send message..."> 
     </div> 
    </div> 
</div> 

万一他们相关的,这里是我路线

Route::post('/chat', function (Request $request) { 
    event(new MessageSent($request->message)); 
}); 

事件

<?php 

namespace App\Events; 

use Illuminate\Broadcasting\Channel; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Broadcasting\PrivateChannel; 
use Illuminate\Broadcasting\PresenceChannel; 
use Illuminate\Broadcasting\InteractsWithSockets; 
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 

class MessageSent implements ShouldBroadcast 
{ 
    use InteractsWithSockets, SerializesModels; 

    public $message; 

    public function __construct($message) 
    { 
     $this->message = $message; 
    } 

    public function broadcastOn() 
    { 
     return new Channel('test-chat-channel'); 
    } 
} 

回答

2

我在我目前正在建设的应用程序中使用Redis的PubSub的,不得不打了同样的问题。虽然我不知道laravel-echo-server足以专门针对如何解决问题提出建议,但我可以描述此症状的可能原因。

您的配置正在每个周期订阅Redis频道,并且该订阅不是短暂的。每次订阅时,都会创建一个新的侦听器。每次发布时,Redis都会将消息发送给所有听众/订阅者。如果一个客户已经订购了三次,它将会收到该消息三次。您需要认识到您已订阅且不需要复制它,或者您需要在每个周期后取消订阅。

需要注意的一件事是,Redis实例应该发布或订阅,但不能同时发布。 laravel-echo-server可能正在为你处理。

Redis通常会在每次发布时返回接收消息的订阅者数量。这帮助我诊断问题,尤其是因为我正在运行私人频道,并且每个讯息应该有1个,且只有1个侦听器。 Redis还有一个“numsub”命令,用于返回通道上监听器的数量。

我注意到你的sendMessage函数使用了listen方法。这是在黑暗中拍摄的,但是,您获得多个订阅的位置?

无论哪种方式,如果您有具体的问题可以回答,我很乐意提供帮助。

+0

我想你可能会在这里。我认为我应该做的是将listen方法分开,而不是在成功请求的响应回调中进行......这可能是导致此问题的原因 - 我实际上并不需要响应回调,只是一个错误回调,并且在请求之外侦听事件以避免超额订阅。谢谢你,我会给你一个机会,让你知道! –

+0

@ A.Appleby对我来说,这看起来很可能。 –

+0

@ A.Appleby最近怎么样?你解决了吗?我是否能帮助? –