1

我有这个工作:

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 倍。

任何提示如何获得更准确的在线离线日志到数据库?

4

2 回答 2

1

如果您使用的是 Pusher Channels,您可以为您的 Channels 应用程序配置在线状态 webhook。您可以在每个应用程序的基础上在您的帐户仪表板中激活 webhook 。

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

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

如果用户可以同时加入多个房间(频道)(例如房间 1、房间 2、房间 3),您可能希望通过拥有用户特定的在线频道来跟踪用户是在线还是离线。

例如,如果用户被称为“Joe Bloggs”,您将在首次连接到您的 Pusher 应用程序时加入一个名为 joebloggs 的频道。(如果用户加入这个频道,他们在线,如果用户离开这个频道,他们离线)

于 2020-04-05T13:12:49.427 回答
-1

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

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

Redis 处理发布/订阅机制。Laravel Echo Server 会在每次有人加入/离开状态频道时发布,并且使用 Artisan 命令,您可以订阅 Redis 并通过通知您的数据库来对加入/离开做出反应。

于 2020-04-05T12:02:25.313 回答