<?php
/**
* Resolves dependencies of directories for scheduled runs with fallback logic.
*
* @param array $dependencies An array of directory dependencies, where each key is a directory name
* and the value is an array of directories it depends on.
* @param array $fallback_directories An array of directories to use as fallback options if a dependency is missing.
* @param string $scheduled_run_path The path where the scheduled run will execute.
* @return array An array of resolved directories, or an error message if resolution fails.
*/
function resolveDependencies(array $dependencies, array $fallback_directories, string $scheduled_run_path): array
{
$resolved_directories = [];
$missing_dependencies = [];
// Function to recursively resolve dependencies
function resolve(array $dependencies, array &$resolved_directories, array &$missing_dependencies): void
{
foreach ($dependencies as $directory => $required_dependencies) {
if (!is_dir($directory)) {
$missing_dependencies[] = $directory;
continue;
}
$resolved_directories[$directory] = $directory; // Resolve the current directory
foreach ($required_dependencies as $required_directory) {
if (!is_dir($required_directory)) {
$missing_dependencies[] = $required_directory;
} else {
resolve([$required_directory => []], $resolved_directories, $missing_dependencies); // Recursively resolve the required directory
}
}
}
}
resolve($dependencies, $resolved_directories, $missing_dependencies);
// Handle missing dependencies with fallback
if (!empty($missing_dependencies)) {
$fallback_resolved = [];
foreach ($missing_dependencies as $missing_dir) {
if (!empty($fallback_directories)) {
$fallback_resolved[$missing_dir] = $fallback_directories[array_rand($fallback_directories)]; // Randomly pick a fallback directory
error_log("Using fallback directory for missing dependency: " . $missing_dir);
} else {
return ["error" => "No fallback directories provided for missing dependencies: " . implode(", ", $missing_dependencies)];
}
}
//Merge resolved and fallback directories
$resolved_directories = array_merge($resolved_directories, $fallback_resolved);
}
if (empty($resolved_directories)) {
return ["error" => "No directories could be resolved. Check dependencies and fallback directories."];
}
return $resolved_directories;
}
//Example Usage
/*
$dependencies = [
'data' => ['db', 'processed'],
'reports' => ['data', 'processed'],
'scheduled_run' => ['reports']
];
$fallback_directories = ['/var/www/fallback', '/opt/fallback'];
$scheduled_run_path = '/var/www/scheduled_run';
$resolved = resolveDependencies($dependencies, $fallback_directories, $scheduled_run_path);
if (isset($resolved['error'])) {
echo "Error: " . $resolved['error'];
} else {
echo "Resolved Directories:\n";
print_r($resolved);
}
*/
?>
Add your comment