Laravel 广播频道 - 检查连接

Laravel Broadcast Channels - check connections

我在文档中或通过搜索都找不到这个,也许有人有一些提示。我正在尝试检查后端的状态通道上有多少连接。

我可以像这样用 Echo 在前端检查是否正常:

Echo.join('chat')
    .here((users) => {
        // users.length is the proper count of connections
    })

但有没有办法让我获得相同数量的连接,但在 Laravel 内某处的后端代码中?

我认为这不可能。通道位于客户端(带有 JS 的网站)和 WebSocket-Server(自己的 NodeJS-Server 或 Pusher-Servers)之间。 Laravel 只是将事件推送给他们,但从不拉取。

要找到解决方案,我们必须知道您使用的是哪个驱动程序(redis 或 pusher)。也许可以用 curl 询问推送服务器服务器上有多少用户。

对于 pusher 这看起来很有趣:https://support.pusher.com/hc/en-us/articles/204113596-Showing-who-s-online-with-a-large-number-of-users and https://pusher.com/docs/rest_api#method-get-channels

对于 Redis,您可以在 NodeJS 服务器内部实现一些逻辑来监听通道并向 laravel 发出请求。

独立的最佳解决方案是从每个客户端发出请求以更新数据库中的计数器:

Echo.join('chat')
.here((users) => {
    //request to laravel api with users.length
})

此方法的缺点是,它仅在用户连接到频道时更新值

如果您使用的是 Pusher,后端只需执行以下操作:

$response = $pusher->get( '/channels/presence-channel-name/users' );
if( $response[ 'status'] == 200 ) {
  // convert to associative array for easier consumption
  $users = json_decode( $response[ 'body' ], true )[ 'users' ];
}

$userCount = count($users);

您可以在推送器中阅读更多相关信息 documentation. The pusher-http-php sdk 也有一些相关文档。

A list of users present on a presence channel can be retrieved by querying the /channels/[channel_name]/users resource where the channel_name is replaced with a valid presence channel name.

这明确地用于存在频道。

此外,您还可以通过webhooks跟踪频道中的用户。

Notify your application whenever a user subscribes to or unsubscribes from a Presence channel. For example, this allows you to synchronise channel presence state on your server as well as all your application clients.

Pusher 将使用以下形式的信息访问您的服务器:

{
  "name": "member_added", // or "member_removed"
  "channel": "presence-your_channel_name",
  "user_id": "a_user_id"
}

此数据可能存储在您的数据库中的 table 中,或者存储在 redis 中。

或者可以是这个作为回应

{ "user_id": "a_user_id" "name": "member_added", // 或 "member_removed" "channel": "presence-your_channel_name", }