singleton(\App\Framework\Logging\Logger::class, $logger); $container->singleton(\App\Framework\Performance\MemoryMonitor::class, $memoryMonitor); $container->singleton(\App\Framework\ReflectionLegacy\ReflectionProvider::class, $reflectionProvider); $container->singleton(\App\Framework\Filesystem\FileSystemService::class, $fileSystemService); echo "โœ… Dependencies initialized\n"; // Test 1: Memory Manager Creation and Configuration echo "\n๐Ÿงช Test 1: Memory Manager Configuration\n"; $memoryLimit = Byte::fromMegabytes(64); $strategy = MemoryStrategy::ADAPTIVE; $memoryManager = new DiscoveryMemoryManager( strategy: $strategy, memoryLimit: $memoryLimit, memoryPressureThreshold: 0.7, memoryMonitor: $memoryMonitor, logger: $logger ); echo "โœ… Memory Manager created\n"; echo " Strategy: {$strategy->value}\n"; echo " Memory Limit: {$memoryLimit->toHumanReadable()}\n"; echo " Description: {$memoryManager->getStrategyDescription()}\n"; // Test 2: Memory Status Monitoring echo "\n๐Ÿงช Test 2: Memory Status Monitoring\n"; $memoryStatus = $memoryManager->getMemoryStatus(); echo "โœ… Memory status retrieved\n"; echo " Current Status: {$memoryStatus->status->value}\n"; echo " Current Usage: {$memoryStatus->currentUsage->toHumanReadable()}\n"; echo " Memory Pressure: {$memoryStatus->memoryPressure->toString()}\n"; echo " Available Memory: {$memoryStatus->availableMemory->toHumanReadable()}\n"; // Test 3: Chunk Size Calculation echo "\n๐Ÿงช Test 3: Adaptive Chunk Size Calculation\n"; $totalFiles = 1000; $optimalChunkSize = $memoryManager->calculateOptimalChunkSize($totalFiles); echo "โœ… Optimal chunk size calculated\n"; echo " Total Files: {$totalFiles}\n"; echo " Optimal Chunk Size: {$optimalChunkSize}\n"; echo " Estimated Batches: " . ceil($totalFiles / $optimalChunkSize) . "\n"; // Test 4: Memory Guard Creation and Testing echo "\n๐Ÿงช Test 4: Memory Guard Operations\n"; $memoryGuard = $memoryManager->createMemoryGuard(); echo "โœ… Memory Guard created\n"; // Perform several guard checks for ($i = 1; $i <= 5; $i++) { $guardResult = $memoryGuard->check(); echo " Check {$i}: Status={$guardResult->memoryStatus->status->value}, Actions=" . count($guardResult->actions) . "\n"; if ($guardResult->requiresImmediateAction()) { echo " โš ๏ธ Immediate action required!\n"; } } $guardStats = $memoryGuard->getStatistics(); echo " Guard Statistics: {$guardStats->totalChecks} checks, Emergency Mode: " . ($guardStats->emergencyMode ? 'ON' : 'OFF') . "\n"; // Test 5: Memory Cleanup echo "\n๐Ÿงช Test 5: Memory Cleanup Operations\n"; $beforeCleanup = Byte::fromBytes(memory_get_usage(true)); echo " Memory before cleanup: {$beforeCleanup->toHumanReadable()}\n"; $cleanupResult = $memoryManager->performCleanup(); echo "โœ… Memory cleanup performed\n"; echo " Memory freed: {$cleanupResult->memoryFreed->toHumanReadable()}\n"; echo " Collected cycles: {$cleanupResult->collectedCycles}\n"; echo " Was effective: " . ($cleanupResult->wasEffective() ? 'Yes' : 'No') . "\n"; // Test 6: Memory Strategy Suggestions echo "\n๐Ÿงช Test 6: Memory Strategy Suggestions\n"; $testCases = [ ['files' => 100, 'memory' => 32, 'desc' => 'Small project, low memory'], ['files' => 5000, 'memory' => 128, 'desc' => 'Medium project, normal memory'], ['files' => 50000, 'memory' => 256, 'desc' => 'Large project, high memory'], ['files' => 1000, 'memory' => 64, 'desc' => 'Normal project, limited memory'], ]; foreach ($testCases as $case) { $suggestedStrategy = MemoryStrategy::suggestForDiscovery( $case['files'], $case['memory'], true ); echo " {$case['desc']}: {$suggestedStrategy->value}\n"; } // Test 7: Batch Parameter Calculation echo "\n๐Ÿงช Test 7: Batch Parameter Calculation\n"; $averageFileSize = Byte::fromKilobytes(25); // 25KB average file $batchParams = $memoryManager->calculateBatchParameters(500, $averageFileSize); echo "โœ… Batch parameters calculated\n"; echo " Chunk Size: {$batchParams->chunkSize}\n"; echo " Batch Count: {$batchParams->batchCount}\n"; echo " Memory per Batch: {$batchParams->estimatedMemoryPerBatch->toHumanReadable()}\n"; echo " Strategy: {$batchParams->strategy->value}\n"; // Test 8: Service Integration Test echo "\n๐Ÿงช Test 8: Service Integration Test\n"; // Create factory $factory = new DiscoveryServiceFactory($container, $pathProvider, $cache, $clock); // Create configuration with memory management enabled $config = new DiscoveryConfiguration( paths: [$pathProvider->getBasePath() . '/src/Application/Admin'], useCache: false, enableMemoryMonitoring: true, enablePerformanceTracking: true, memoryLimitMB: 32, // Low limit to test chunking maxFilesPerBatch: 10 // Small batches ); // Create service with memory management $discoveryService = $factory->create($config); echo "โœ… Discovery service created with memory management\n"; // Get health status to verify memory management integration $healthStatus = $discoveryService->getHealthStatus(); if (isset($healthStatus['memory_management'])) { echo "โœ… Memory management integrated successfully\n"; echo " Strategy: {$healthStatus['memory_management']['strategy']}\n"; echo " Memory Limit: {$healthStatus['memory_management']['memory_limit']}\n"; echo " Current Usage: {$healthStatus['memory_management']['current_usage']}\n"; } // Get memory statistics $memoryStats = $discoveryService->getMemoryStatistics(); echo "โœ… Memory statistics available\n"; echo " Strategy Description: {$memoryStats['strategy_description']}\n"; echo " Recommendations: " . count($memoryStats['recommendations']) . " items\n"; // Test 9: Quick Discovery Run with Memory Management echo "\n๐Ÿงช Test 9: Quick Discovery Run with Memory Management\n"; $startTime = microtime(true); $startMemory = Byte::fromBytes(memory_get_usage(true)); $options = new DiscoveryOptions( scanType: ScanType::FULL, paths: [$pathProvider->getBasePath() . '/src/Application/Admin'], useCache: false ); $registry = $discoveryService->discoverWithOptions($options); $endTime = microtime(true); $endMemory = Byte::fromBytes(memory_get_usage(true)); echo "โœ… Discovery with memory management completed\n"; echo " Processing Time: " . round(($endTime - $startTime) * 1000, 2) . "ms\n"; echo " Memory Used: " . $endMemory->subtract($startMemory)->toHumanReadable() . "\n"; echo " Peak Memory: " . Byte::fromBytes(memory_get_peak_usage(true))->toHumanReadable() . "\n"; echo " Registry Size: " . count($registry) . " items\n"; // Final memory statistics $finalMemoryStats = $discoveryService->getMemoryStatistics(); echo " Final Memory Status: {$finalMemoryStats['memory_status']['status']}\n"; echo " Guard Checks: {$finalMemoryStats['guard_statistics']['total_checks']}\n"; if (! empty($finalMemoryStats['chunking_performance'])) { echo " Chunks Processed: {$finalMemoryStats['chunking_performance']['total_chunks_processed']}\n"; echo " Average Chunk Size: " . round($finalMemoryStats['chunking_performance']['average_chunk_size'], 1) . "\n"; } echo "\n๐ŸŽ‰ All memory management tests passed successfully!\n"; echo "\n๐Ÿ† Key Memory Management Features Verified:\n"; echo " โœ… Adaptive memory strategy selection\n"; echo " โœ… Real-time memory monitoring and guards\n"; echo " โœ… Intelligent chunk size calculation\n"; echo " โœ… Memory cleanup and leak detection\n"; echo " โœ… Batch parameter optimization\n"; echo " โœ… Emergency memory handling\n"; echo " โœ… Full Discovery service integration\n"; echo " โœ… Performance tracking and statistics\n"; } catch (Throwable $e) { echo "\nโŒ Error during memory management testing:\n"; echo " Message: " . $e->getMessage() . "\n"; echo " File: " . $e->getFile() . ":" . $e->getLine() . "\n"; echo " Stack trace:\n" . $e->getTraceAsString() . "\n"; exit(1); }