route('admin.ops.index') ->with('ops_success', '✅ 应用缓存已清除(config:clear + cache:clear)'); } /** * 清理路由缓存(route:clear) */ public function clearRoutes(): RedirectResponse { if (Auth::id() !== 1) { abort(403, '无权限操作'); } Artisan::call('route:clear'); return redirect()->route('admin.ops.index') ->with('ops_success', '✅ 路由缓存已清除(route:clear)'); } /** * 清理视图缓存(view:clear) */ public function clearViews(): RedirectResponse { if (Auth::id() !== 1) { abort(403, '无权限操作'); } Artisan::call('view:clear'); return redirect()->route('admin.ops.index') ->with('ops_success', '✅ 视图缓存已清除(view:clear)'); } /** * 清理所有房间 Redis 在线名单(清除幽灵在线脏数据) */ public function clearRoomOnline(): RedirectResponse { if (Auth::id() !== 1) { abort(403, '无权限操作'); } $prefix = config('database.redis.options.prefix', ''); $cursor = '0'; $cleaned = 0; do { [$cursor, $keys] = Redis::scan($cursor, ['match' => $prefix.'room:*:users', 'count' => 100]); foreach ($keys ?? [] as $fullKey) { // 去掉前缀,还原为 Laravel Facade 使用的短 Key $shortKey = $prefix ? substr($fullKey, strlen($prefix)) : $fullKey; Redis::del($shortKey); $cleaned++; } } while ($cursor !== '0'); return redirect()->route('admin.ops.index') ->with('ops_success', "✅ 已清理 {$cleaned} 个房间的在线名单(幽灵在线已清除)"); } }