memoryMonitor->getSummary(); echo "๐Ÿ’พ Memory Status:\n"; echo " Current: {$memorySummary->getCurrentHumanReadable()}\n"; echo " Available: {$memorySummary->getAvailableMemory()->toHumanReadable()}\n"; echo " Usage: {$memorySummary->getUsagePercentageFormatted()}\n\n"; // Show cleanup statistics echo "๐Ÿ“Š Cleanup Statistics:\n"; $stats = $this->cleanupService->getCleanupStatistics(); echo " Eligible for cleanup:\n"; echo " โ€ข Completed jobs: " . number_format($stats['eligible_completed_jobs']) . " (>{$stats['retention_days']['completed_jobs']} days)\n"; echo " โ€ข Failed jobs: " . number_format($stats['eligible_failed_jobs']) . " (>{$stats['retention_days']['failed_jobs']} days)\n"; echo " โ€ข Job metrics: " . number_format($stats['eligible_metrics']) . " (>{$stats['retention_days']['metrics']} days)\n"; echo " โ€ข Dead letter jobs: " . number_format($stats['eligible_dead_letter_jobs']) . " (>{$stats['retention_days']['dead_letter_jobs']} days)\n"; echo " โ€ข Total eligible: " . number_format($stats['total_eligible']) . "\n"; echo " โ€ข Estimated time: ~{$stats['estimated_cleanup_minutes']} minutes\n\n"; if ($stats['total_eligible'] === 0) { echo "โœ… No data eligible for cleanup\n"; return ExitCode::SUCCESS; } echo "๐Ÿ”„ Starting cleanup process...\n\n"; // Run comprehensive cleanup $results = $this->cleanupService->runComprehensiveCleanup(); // Display results echo "โœ… Cleanup Results:\n"; echo " โ€ข Completed jobs deleted: " . number_format($results['completed_jobs']) . "\n"; echo " โ€ข Failed jobs deleted: " . number_format($results['failed_jobs']) . "\n"; echo " โ€ข Job metrics deleted: " . number_format($results['job_metrics']) . "\n"; echo " โ€ข Dead letter jobs deleted: " . number_format($results['dead_letter_jobs']) . "\n"; echo " โ€ข Total deleted: " . number_format($results['total_deleted']) . "\n\n"; echo "โฑ๏ธ Performance:\n"; echo " โ€ข Duration: {$results['duration_seconds']} seconds\n"; echo " โ€ข Memory used: {$results['memory_used']}\n"; echo " โ€ข Peak memory: {$results['memory_peak']}\n\n"; if (!empty($results['errors'])) { echo "โš ๏ธ Errors occurred:\n"; foreach ($results['errors'] as $error) { echo " โ€ข {$error}\n"; } return ExitCode::GENERAL_ERROR; } echo "โœ… Cleanup completed successfully!\n"; return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } #[ConsoleCommand(name: 'queue:cleanup:completed', description: 'Clean up completed jobs older than specified days')] public function cleanupCompletedJobs(int $days = 30): ExitCode { echo "๐Ÿงน Cleaning Completed Jobs\n\n"; try { if ($days < 1) { echo "โŒ Days must be at least 1\n"; return ExitCode::INVALID_ARGUMENT; } echo "๐Ÿ“Š Configuration:\n"; echo " โ€ข Delete completed jobs older than: {$days} days\n\n"; $duration = Duration::fromDays($days); $deleted = $this->cleanupService->cleanupCompletedJobs($duration); echo "โœ… Cleanup Results:\n"; echo " โ€ข Completed jobs deleted: " . number_format($deleted) . "\n"; return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } #[ConsoleCommand(name: 'queue:cleanup:failed', description: 'Clean up failed jobs older than specified days')] public function cleanupFailedJobs(int $days = 90): ExitCode { echo "๐Ÿงน Cleaning Failed Jobs\n\n"; try { if ($days < 1) { echo "โŒ Days must be at least 1\n"; return ExitCode::INVALID_ARGUMENT; } echo "๐Ÿ“Š Configuration:\n"; echo " โ€ข Delete failed jobs older than: {$days} days\n\n"; $duration = Duration::fromDays($days); $deleted = $this->cleanupService->cleanupFailedJobs($duration); echo "โœ… Cleanup Results:\n"; echo " โ€ข Failed jobs deleted: " . number_format($deleted) . "\n"; return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } #[ConsoleCommand(name: 'queue:cleanup:metrics', description: 'Clean up job metrics older than specified days')] public function cleanupMetrics(int $days = 180): ExitCode { echo "๐Ÿงน Cleaning Job Metrics\n\n"; try { if ($days < 1) { echo "โŒ Days must be at least 1\n"; return ExitCode::INVALID_ARGUMENT; } echo "๐Ÿ“Š Configuration:\n"; echo " โ€ข Delete metrics older than: {$days} days\n\n"; $duration = Duration::fromDays($days); $deleted = $this->cleanupService->cleanupJobMetrics($duration); echo "โœ… Cleanup Results:\n"; echo " โ€ข Job metrics deleted: " . number_format($deleted) . "\n"; return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } #[ConsoleCommand(name: 'queue:cleanup:deadletter', description: 'Clean up dead letter jobs older than specified days')] public function cleanupDeadLetterJobs(int $days = 365): ExitCode { echo "๐Ÿงน Cleaning Dead Letter Jobs\n\n"; try { if ($days < 1) { echo "โŒ Days must be at least 1\n"; return ExitCode::INVALID_ARGUMENT; } echo "๐Ÿ“Š Configuration:\n"; echo " โ€ข Delete dead letter jobs older than: {$days} days\n\n"; $duration = Duration::fromDays($days); $deleted = $this->cleanupService->cleanupDeadLetterJobs($duration); echo "โœ… Cleanup Results:\n"; echo " โ€ข Dead letter jobs deleted: " . number_format($deleted) . "\n"; return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } #[ConsoleCommand(name: 'queue:cleanup:stats', description: 'Show cleanup statistics without performing cleanup')] public function showCleanupStatistics(): ExitCode { echo "๐Ÿ“Š Queue Cleanup Statistics\n\n"; try { $stats = $this->cleanupService->getCleanupStatistics(); echo "๐Ÿ“‹ Retention Periods:\n"; echo " โ€ข Completed jobs: {$stats['retention_days']['completed_jobs']} days\n"; echo " โ€ข Failed jobs: {$stats['retention_days']['failed_jobs']} days\n"; echo " โ€ข Job metrics: {$stats['retention_days']['metrics']} days\n"; echo " โ€ข Dead letter jobs: {$stats['retention_days']['dead_letter_jobs']} days\n\n"; echo "๐Ÿ—‘๏ธ Eligible for Cleanup:\n"; echo " โ€ข Completed jobs: " . number_format($stats['eligible_completed_jobs']) . "\n"; echo " โ€ข Failed jobs: " . number_format($stats['eligible_failed_jobs']) . "\n"; echo " โ€ข Job metrics: " . number_format($stats['eligible_metrics']) . "\n"; echo " โ€ข Dead letter jobs: " . number_format($stats['eligible_dead_letter_jobs']) . "\n"; echo " โ€ข Total eligible: " . number_format($stats['total_eligible']) . "\n\n"; echo "โฑ๏ธ Estimated Cleanup Time: ~{$stats['estimated_cleanup_minutes']} minutes\n\n"; // Memory recommendations $recommendations = $this->memoryManager->getMemoryRecommendations(); echo "๐Ÿ’พ Memory Recommendations:\n"; echo " โ€ข Current usage: {$recommendations['current_usage']}\n"; echo " โ€ข Available memory: {$recommendations['available']}\n"; echo " โ€ข Priority: {$recommendations['priority']}\n"; foreach ($recommendations['recommendations'] as $rec) { echo "\n ๐Ÿ“Œ {$rec['type']}:\n"; echo " {$rec['message']}\n"; if (!empty($rec['actions'])) { echo " Actions:\n"; foreach ($rec['actions'] as $action) { echo " โ€ข {$action}\n"; } } } return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } #[ConsoleCommand(name: 'queue:memory:status', description: 'Show current memory status and recommendations')] public function showMemoryStatus(): ExitCode { echo "๐Ÿ’พ Queue Memory Status\n\n"; try { // Get memory snapshot $snapshot = $this->memoryManager->getJobMemorySnapshot('memory_status_check'); echo "๐Ÿ“Š Current Memory Usage:\n"; echo " โ€ข Current: {$snapshot['current']} ({$snapshot['usage_percentage']}%)\n"; echo " โ€ข Peak: {$snapshot['peak']}\n"; echo " โ€ข Limit: {$snapshot['limit']}\n"; echo " โ€ข Available: {$snapshot['available']}\n"; echo " โ€ข Status: {$snapshot['status']}\n\n"; // Status indicators if ($snapshot['is_critical']) { echo "๐Ÿ”ด CRITICAL: Memory usage is critically high!\n\n"; } elseif ($snapshot['is_warning']) { echo "๐ŸŸก WARNING: Memory usage is elevated.\n\n"; } else { echo "๐ŸŸข NORMAL: Memory usage is within acceptable limits.\n\n"; } // Get recommendations $recommendations = $this->memoryManager->getMemoryRecommendations(); echo "๐Ÿ“Œ Recommendations:\n"; foreach ($recommendations['recommendations'] as $rec) { echo "\n {$rec['type']}:\n"; echo " {$rec['message']}\n"; if (!empty($rec['actions'])) { echo " Suggested actions:\n"; foreach ($rec['actions'] as $action) { echo " โ€ข {$action}\n"; } } } return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } #[ConsoleCommand(name: 'queue:memory:optimize', description: 'Optimize memory for job processing')] public function optimizeMemory(): ExitCode { echo "๐Ÿ”ง Optimizing Queue Memory\n\n"; try { echo "๐Ÿ“Š Before Optimization:\n"; $beforeSnapshot = $this->memoryManager->getJobMemorySnapshot('before_optimization'); echo " โ€ข Memory: {$beforeSnapshot['current']} ({$beforeSnapshot['usage_percentage']}%)\n\n"; echo "๐Ÿ”„ Running optimization...\n"; $optimization = $this->memoryManager->optimizeForJob('manual_optimization'); echo "\n๐Ÿ“Š After Optimization:\n"; echo " โ€ข Memory: {$optimization['after']}\n"; echo " โ€ข Freed: {$optimization['freed']}\n"; echo " โ€ข Usage before: {$optimization['usage_before']}\n"; echo " โ€ข Usage after: {$optimization['usage_after']}\n\n"; if ($optimization['freed_bytes'] > 0) { echo "โœ… Successfully freed {$optimization['freed']} of memory\n"; } else { echo "โ„น๏ธ No significant memory was freed (system may have already been optimized)\n"; } return ExitCode::SUCCESS; } catch (\Exception $e) { echo "โŒ Error: {$e->getMessage()}\n"; return ExitCode::GENERAL_ERROR; } } }