109 lines
2.9 KiB
PHP
109 lines
2.9 KiB
PHP
<?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} 个房间的在线名单(幽灵在线已清除)");
|
||
}
|
||
}
|