Laravel Presence Channel:在数据库中存储加入和离开用户

Laravel Presence Channel: Store Joining and Leaving Users in database

我有这个工作:

Echo.join(`chat.${roomId}`)
    .here((users) => {
        //
    })
    .joining((user) => {
        this.users.push(user);
        this.saveStatus(user, 'online');
    })
    .leaving((user) => {
        this.users = this.users.filter(u => u.id != user.id);
        this.saveStatus(user, 'offline');
   });

这向我显示了存在的用户的准确列表。 但我想要的是将它们的状态也存储在带有时间戳的数据库中。

所以我想到了这个功能:

saveStatus(user, status) {
   axios.post("/logbooks", { user_id: user.id, status: "offline"})
}

并在加入和离开状态下调用该函数。 但这并不准确:当只有一个用户在线时,它不会存储值。当有 20 个用户离线时,一个用户离线 > 它会存储这个值的 19 倍。

有什么技巧可以让数据库的在线离线日志更准确吗?

您可以使用 Laravel Echo Server(而不是 Pusher)和 Redis 来解决这个问题。这是文档:

https://github.com/tlaverdure/laravel-echo-server#presence-channels

Redis 处理publish/subscribe 机制。 Laravel Echo Server 每次有人 joins/leaves 时都会发布一个存在通道,并且使用 Artisan 命令,您可以订阅 Redis 并通过通知您的数据库对 join/leave 做出反应。

如果您使用的是 Pusher Channels,则可以为您的 Channels 应用配置状态 Webhook。您可以在每个应用的基础上在 account dashboard 中激活网络钩子。

presence webhook 将被以下事件触发; member_added 和 member_removed(用户加入状态频道或用户离开状态频道(下线)):

您可以在您的服务器上侦听这些事件,然后根据您收到的事件更新用户状态。

如果用户可以一次加入多个房间(频道)(例如 room1、room2、room3),您可能希望通过拥有特定于用户的在线状态频道来跟踪用户是在线还是离线。

例如,如果用户名为 'Joe Bloggs',您将在首次连接到 Pusher 应用程序时加入一个名为 joebloggs 的频道。 (如果用户加入此频道则为在线,如果用户离开此频道则为离线)