Files
chatroom/app/Http/Controllers/Admin/OpsController.php

109 lines
2.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能:运维工具控制器
* 提供缓存清理、路由清理、视图清理、房间在线名单清理等一键运维操作
* 仅 id=1 超管可访问
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redis;
use Illuminate\View\View;
class OpsController extends Controller
{
/**
* 运维工具主页
*/
public function index(): View
{
if (Auth::id() !== 1) {
abort(403, '无权限操作');
}
return view('admin.ops.index');
}
/**
* 清理应用缓存config:clear + cache:clear
*/
public function clearCache(): RedirectResponse
{
if (Auth::id() !== 1) {
abort(403, '无权限操作');
}
Artisan::call('config:clear');
Artisan::call('cache:clear');
return redirect()->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} 个房间的在线名单(幽灵在线已清除)");
}
}