一年半以来,我一直在努力寻找解决方案,这是我关于这个问题的另一篇帖子,但目前还没有解决方案https://github.com/beyondcode/laravel-websockets/issues/322
由于那篇文章没有任何改变,我拥有我所涉及的所有资源的最新版本(上个半月更新)
包.json
"laravel-echo": "^1.10.0",
"laravel-echo-server": "^1.6.2",
作曲家.json
"beyondcode/laravel-websockets": "^1.11.1",
"pusher/pusher-php-server": "^4.1.5"
并且由于该问题报告没有任何改变,现在不同的是我的问题在聊天模块中更为持久。
基本上,websockets 在大多数情况下都可以工作,但是由于某些奇怪的原因,在某些时候决定不将更新传递给订阅的用户,或者 laravel echo 进入睡眠状态并忘记处理传递的更新,所以人 X 发送了一条消息给 Y 人,但 Y 人不会收到所述消息,在某个时候,当 X 人发送一条新消息时系统再次开始工作,然后 Y 人突然收到所有消息,但第一条消息最初是在 30 分钟前发送的太晚了,另一种情况是人们甚至可以在他们的聊天中看到重复的消息,尽管这并不让我太担心未交付的更新问题,因为我的应用程序可以用来通知用户人们准备好了预约服务台,而那些用户不会不知道,因为消息从未及时传递。
这是偶尔发生的事情,以至于我无法在本地环境中重现它,因此我可以轻松跟踪问题。系统 90% 的时间都在工作,但其他 10% 的时间似乎对我的用户的影响足以代表他们遇到的问题。如果您按照 github 链接,从那时起该代码没有任何变化,但我将添加聊天模块订阅的代码(请记住,我有其他 vue 文件具有对其他模块的不同订阅(我认为有 5 个不同每个用户的频道订阅总数):
对话.vue
/**
* Starts listening to update conversation events.
*
*/
updateChat() {
Echo.channel(`update-conversation.${this.office_id}.${this.conversation.id}.${this.user_id}`)
.listen('.list.new.messages', (event) => {
this.listNewMessages();
});
},
/**
* Stops listening to update conversation events.
*
*/
stopUpdatingChat() {
Echo.leaveChannel(`update-conversation.${this.office_id}.${this.conversation.id}.${this.user_id}`);
Event.$emit('stop-new-devsupport-conversation', this.conversation.id, this.user_id);
},
频道.php
Broadcast::channel('update-conversation.{officeId}.{conversationId}.{userId}', function ($user, $officeId, $conversationId, $userId) {
return ($user->hasPermission('chat') && $user->office_id === $officeId && $user->id === $conversationId && User::find($userId)->office_id === $officeId);
});
这是事件ConversationEvent.php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class ConversationEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $officeId;
public $conversationId;
public $userId;
/**
* Create a new event instance.
*
* @param int $officeId
* @param int $conversationId
* @param int $userId
* @return void
*/
public function __construct($officeId, $conversationId, $userId)
{
$this->officeId = $officeId;
$this->conversationId = $conversationId;
$this->userId = $userId;
}
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs()
{
return 'list.new.messages';
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new Channel('update-conversation.' . $this->officeId . '.' . $this->conversationId . '.' . $this->userId);
}
}
除此之外,这是Bootstrap.js文件中的Echo配置
window.Echo = new Echo({
broadcaster: 'pusher',
key: window.PUSHER_APP_KEY,
wsHost: window.location.hostname,
wsPort: window.APP_DEBUG ? 6001 : 6002,
wssPort: window.APP_DEBUG ? 6001 : 6002,
disableStats: true,
encrypted: !window.APP_DEBUG,
enabledTransports: ['ws', 'wss'],
forceTLS: false,
});
和广播.php
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'encrypted' => true,
'host' => '127.0.0.1',
'port' => 6001,
'scheme' => 'http',
],
],
]
就像我在我的 github 帖子上所说的那样,我完全基于这个https://alex.bouma.dev/installing-laravel-websockets-on-forge/来配置我的 websockets 以使其与 Forge 一起使用
我不知道,但是如果用户在一定时间后没有收到更新,自动取消订阅频道可能会超时吗?我真的不这么认为,因为一些客户发给我的屏幕截图在消息之间有 8 分钟的间隔。
我真的,真的很想最终找到解决这个问题的方法,所以请,如果有人可以伸出援手,我将非常感激。
提前致谢。