Laravel 11, Vuexy Admin 10.3, by admin@koneko.mx
This commit is contained in:
		
							
								
								
									
										153
									
								
								modules/Admin/App/Services/SessionManagerService.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								modules/Admin/App/Services/SessionManagerService.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,153 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Modules\Admin\App\Services;
 | 
			
		||||
 | 
			
		||||
use Illuminate\Support\Facades\Cache;
 | 
			
		||||
use Illuminate\Support\Facades\DB;
 | 
			
		||||
use Illuminate\Support\Facades\Redis;
 | 
			
		||||
 | 
			
		||||
class SessionManagerService
 | 
			
		||||
{
 | 
			
		||||
    private string $driver;
 | 
			
		||||
 | 
			
		||||
    public function __construct(string $driver = null)
 | 
			
		||||
    {
 | 
			
		||||
        $this->driver = $driver ?? config('session.driver');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function getSessionStats(string $driver = null): array
 | 
			
		||||
    {
 | 
			
		||||
        $driver = $driver ?? $this->driver;
 | 
			
		||||
 | 
			
		||||
        if (!$this->isSupportedDriver($driver))
 | 
			
		||||
            return $this->response('warning', 'Driver no soportado o no configurado.', ['session_count' => 0]);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            switch ($driver) {
 | 
			
		||||
                case 'redis':
 | 
			
		||||
                    return $this->getRedisStats();
 | 
			
		||||
 | 
			
		||||
                case 'database':
 | 
			
		||||
                    return $this->getDatabaseStats();
 | 
			
		||||
 | 
			
		||||
                case 'file':
 | 
			
		||||
                    return $this->getFileStats();
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                    return $this->response('warning', 'Driver no reconocido.', ['session_count' => 0]);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (\Exception $e) {
 | 
			
		||||
            return $this->response('danger', 'Error al obtener estadísticas: ' . $e->getMessage(), ['session_count' => 0]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function clearSessions(string $driver = null): array
 | 
			
		||||
    {
 | 
			
		||||
        $driver = $driver ?? $this->driver;
 | 
			
		||||
 | 
			
		||||
        if (!$this->isSupportedDriver($driver)) {
 | 
			
		||||
            return $this->response('warning', 'Driver no soportado o no configurado.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            switch ($driver) {
 | 
			
		||||
                case 'redis':
 | 
			
		||||
                    return $this->clearRedisSessions();
 | 
			
		||||
 | 
			
		||||
                case 'memcached':
 | 
			
		||||
                    Cache::getStore()->flush();
 | 
			
		||||
                    return $this->response('success', 'Se eliminó la memoria caché de sesiones en Memcached.');
 | 
			
		||||
 | 
			
		||||
                case 'database':
 | 
			
		||||
                    DB::table('sessions')->truncate();
 | 
			
		||||
                    return $this->response('success', 'Se eliminó la memoria caché de sesiones en la base de datos.');
 | 
			
		||||
 | 
			
		||||
                case 'file':
 | 
			
		||||
                    return $this->clearFileSessions();
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                    return $this->response('warning', 'Driver no reconocido.');
 | 
			
		||||
            }
 | 
			
		||||
        } catch (\Exception $e) {
 | 
			
		||||
            return $this->response('danger', 'Error al limpiar las sesiones: ' . $e->getMessage());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private function getRedisStats()
 | 
			
		||||
    {
 | 
			
		||||
        $prefix = config('cache.prefix'); // Asegúrate de agregar el sufijo correcto si es necesario
 | 
			
		||||
        $keys = Redis::connection('sessions')->keys($prefix . '*');
 | 
			
		||||
 | 
			
		||||
        return $this->response('success', 'Se ha recargado la información de la caché de Redis.', ['session_count' => count($keys)]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getDatabaseStats(): array
 | 
			
		||||
    {
 | 
			
		||||
        $sessionCount = DB::table('sessions')->count();
 | 
			
		||||
 | 
			
		||||
        return $this->response('success', 'Se ha recargado la información de la base de datos.', ['session_count' => $sessionCount]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getFileStats(): array
 | 
			
		||||
    {
 | 
			
		||||
        $cachePath = config('session.files');
 | 
			
		||||
        $files = glob($cachePath . '/*');
 | 
			
		||||
 | 
			
		||||
        return $this->response('success', 'Se ha recargado la información de sesiones de archivos.', ['session_count' => count($files)]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Limpia sesiones en Redis.
 | 
			
		||||
     */
 | 
			
		||||
    private function clearRedisSessions(): array
 | 
			
		||||
    {
 | 
			
		||||
        $prefix = config('cache.prefix', '');
 | 
			
		||||
        $keys = Redis::connection('sessions')->keys($prefix . '*');
 | 
			
		||||
 | 
			
		||||
        if (!empty($keys)) {
 | 
			
		||||
            Redis::connection('sessions')->flushdb();
 | 
			
		||||
 | 
			
		||||
            // Simulate cache clearing delay
 | 
			
		||||
            sleep(1);
 | 
			
		||||
 | 
			
		||||
            return $this->response('success', 'Se eliminó la memoria caché de sesiones en Redis.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->response('info', 'No se encontraron claves para eliminar en Redis.');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Limpia sesiones en archivos.
 | 
			
		||||
     */
 | 
			
		||||
    private function clearFileSessions(): array
 | 
			
		||||
    {
 | 
			
		||||
        $cachePath = config('session.files');
 | 
			
		||||
        $files = glob($cachePath . '/*');
 | 
			
		||||
 | 
			
		||||
        if (!empty($files)) {
 | 
			
		||||
            foreach ($files as $file) {
 | 
			
		||||
                unlink($file);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return $this->response('success', 'Se eliminó la memoria caché de sesiones en archivos.');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $this->response('info', 'No se encontraron sesiones en archivos para eliminar.');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private function isSupportedDriver(string $driver): bool
 | 
			
		||||
    {
 | 
			
		||||
        return in_array($driver, ['redis', 'memcached', 'database', 'file']);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Genera una respuesta estandarizada.
 | 
			
		||||
     */
 | 
			
		||||
    private function response(string $status, string $message, array $data = []): array
 | 
			
		||||
    {
 | 
			
		||||
        return array_merge(compact('status', 'message'), $data);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user