You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel基于Cache统计在线用户数求助,已实现用户在线状态展示功能

问题原因

你原有写法失效的核心原因有两点:

  1. Cache::has() 方法返回的是布尔值(true/false),对布尔值调用count()不可能得到正确统计结果
  2. 你的缓存键规则是user-is-online-{用户ID},不存在名为user-is-online的统一缓存键,自然无法读取到对应数据

解决方法

方案1:遍历用户表统计(适合用户量<1000的小型应用,所有缓存驱动通用)

直接遍历所有用户,逐个判断缓存是否存在后计数即可,示例代码如下:

控制器中统计

public function getOnlineUserCount()
{
    $onlineCount = 0;
    $allUsers = DB::table('users')->get();
    foreach ($allUsers as $user) {
        if (Cache::has('user-is-online-' . $user->id)) {
            $onlineCount++;
        }
    }
    // 可直接返回数值给前端视图
    return view('your-view', compact('onlineCount'));
}

Blade模板中直接调用(快速调试用)

当前在线用户总数:{{ DB::table('users')->get()->filter(fn($user) => Cache::has('user-is-online-'.$user->id))->count() }}

方案2:缓存标签统计(适合用户量大的中大型应用,要求缓存驱动支持标签,如Redis、Memcached)

如果你的应用使用Redis等支持缓存标签的驱动,可以直接给在线用户缓存打统一标签,不需要每次遍历全表,性能更高:

第一步:修改中间件代码,新增缓存标签

if (Auth::check()) {
    $expiresAt = Carbon::now()->addMinutes(1);
    // 给所有在线用户的缓存打上统一的online_users标签
    Cache::tags(['online_users'])->put('user-is-online-' . Auth::user()->id, true, $expiresAt);
}

第二步:直接统计标签下缓存数量

// 一行代码即可得到在线用户数
$onlineCount = count(Cache::tags('online_users')->getKeys());

注意事项

你现有代码中路由定义存在错误:路由指向StatusController@userOnlineStatus,但实际控制器类名为UserController,需要调整一致否则会报类不存在错误。

内容的提问来源于stack exchange,提问作者Tiran100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:12:00