Laravel基于Cache统计在线用户数求助,已实现用户在线状态展示功能
问题原因
你原有写法失效的核心原因有两点:
Cache::has()方法返回的是布尔值(true/false),对布尔值调用count()不可能得到正确统计结果- 你的缓存键规则是
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
相关产品推荐
相关产品推荐

