Fix bin/publish: use correct .env path for rspade_system Fix bin/publish script: prevent grep exit code 1 from terminating script 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
106 lines
3.1 KiB
PHP
Executable File
106 lines
3.1 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* CODING CONVENTION:
|
|
* This file follows the coding convention where variable_names and function_names
|
|
* use snake_case (underscore_wherever_possible).
|
|
*/
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Log;
|
|
|
|
/**
|
|
* Session Cleanup Command
|
|
* ========================
|
|
*
|
|
* PURPOSE:
|
|
* This command performs routine cleanup of expired and abandoned sessions from
|
|
* the database to prevent unbounded growth of the sessions table.
|
|
*
|
|
* CLEANUP RULES:
|
|
* 1. Guest sessions (user_id = null, site_id = null) older than 24 hours
|
|
* 2. Any sessions older than 3 years (regardless of user/site association)
|
|
*
|
|
* IMPLEMENTATION:
|
|
* - Uses raw DB::statement() for efficiency
|
|
* - Runs hourly via Laravel scheduler
|
|
* - Tracks deletion counts for monitoring
|
|
*
|
|
* WHY RAW SQL:
|
|
* - More efficient for bulk deletions
|
|
* - Clear audit trail in logs
|
|
* - Avoids ORM overhead for maintenance tasks
|
|
*
|
|
* INDEXING:
|
|
* The sessions table has indexes on:
|
|
* - user_id
|
|
* - site_id
|
|
* - updated_at
|
|
* - (updated_at, user_id) composite
|
|
* These indexes ensure efficient query execution.
|
|
*/
|
|
class SessionCleanupCommand extends Command
|
|
{
|
|
/**
|
|
* The name and signature of the console command.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $signature = 'session:cleanup';
|
|
|
|
/**
|
|
* The console command description.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $description = 'Clean up expired and abandoned sessions from the database';
|
|
|
|
/**
|
|
* Execute the console command.
|
|
*/
|
|
public function handle()
|
|
{
|
|
$start_time = microtime(true);
|
|
|
|
// Delete guest sessions older than 24 hours
|
|
// Using MySQL date functions for accuracy and performance
|
|
$guest_count = DB::delete('
|
|
DELETE FROM sessions
|
|
WHERE updated_at < DATE_SUB(NOW(), INTERVAL 24 HOUR)
|
|
AND user_id IS NULL
|
|
AND site_id IS NULL
|
|
');
|
|
|
|
// Delete any sessions older than 3 years
|
|
$old_count = DB::delete('
|
|
DELETE FROM sessions
|
|
WHERE updated_at < DATE_SUB(NOW(), INTERVAL 1 YEAR)
|
|
');
|
|
|
|
$total_deleted = $guest_count + $old_count;
|
|
$execution_time = round(microtime(true) - $start_time, 3);
|
|
|
|
// Log results
|
|
if ($total_deleted > 0) {
|
|
$this->info('Session cleanup completed:');
|
|
$this->info(" • Guest sessions (>24h): {$guest_count} deleted");
|
|
$this->info(" • Old sessions (>3y): {$old_count} deleted");
|
|
$this->info(" • Total: {$total_deleted} sessions removed");
|
|
$this->info(" • Execution time: {$execution_time}s");
|
|
|
|
// Also log to Laravel log for monitoring
|
|
Log::info("Session cleanup: {$total_deleted} sessions deleted", [
|
|
'guest_sessions' => $guest_count,
|
|
'old_sessions' => $old_count,
|
|
'execution_time' => $execution_time,
|
|
]);
|
|
} else {
|
|
$this->info("No sessions to clean up (execution time: {$execution_time}s)");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|