问题标题可能有点混乱,我尽力解释。
我有laravel-echo-server
,redis
(用于排队)和Laravel echo
设置。我想要的只是通过输入发送消息,并为页面上的每个人更新消息提要;本质上是一个聊天室。
一切都有效,除了地狱的速度很慢,但我是Laravel Echo
和Vue
的新手。
如果我发送了一条消息,那很好,但是当我发送另一条消息时,我会收到两条消息。发送第三条消息三个响应等等......
我究竟做错了什么?我已检查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');
}
}
答案 0 :(得分:2)
我在我正在构建的应用程序中使用Redis PubSub并且不得不解决同样的问题。虽然我不太了解laravel-echo-server足以告诉你如何修复它,但我可以描述这种症状的可能原因。
您的配置在每个周期都订阅了Redis频道,并且该订阅不是短暂的。每次订阅时,都会创建一个新的侦听器。每次发布时,Redis都会将消息发送给所有侦听器/订阅者。如果单个客户端订阅了三次,它将收到该消息三次。您需要识别您已订阅且未复制,或者您需要在每个周期后取消订阅。
需要注意的一点是,Redis实例应该发布或订阅,但不能同时发布或订阅。 laravel-echo-server可能正在处理这个问题。
Redis通常会返回每次发布时收到消息的订阅者数量。这有助于我诊断问题,特别是因为我正在运行私有通道,每个消息应该只有1个侦听器。 Redis还有一个&#34; numsub&#34;返回通道上侦听器数量的命令。
我注意到你的sendMessage函数使用了listen方法。它是在黑暗中拍摄的,但是你可以获得多个订阅吗?
无论哪种方式,如果您有一个我可以回答的具体问题,我很乐意进一步提供帮助。
答案 1 :(得分:1)
对于遇到类似问题的任何人,
加载每个页面时,您的Pusher连接可能没有被破坏。如果您有一个已在多个页面上注册的全局组件,则会发生这种情况。为解决此问题,您可以在主布局组件中注册侦听器组件,以防止缓存多个侦听器。