1. <?php
  2. /**
  3. * Resolves dependencies of directories for scheduled runs with fallback logic.
  4. *
  5. * @param array $dependencies An array of directory dependencies, where each key is a directory name
  6. * and the value is an array of directories it depends on.
  7. * @param array $fallback_directories An array of directories to use as fallback options if a dependency is missing.
  8. * @param string $scheduled_run_path The path where the scheduled run will execute.
  9. * @return array An array of resolved directories, or an error message if resolution fails.
  10. */
  11. function resolveDependencies(array $dependencies, array $fallback_directories, string $scheduled_run_path): array
  12. {
  13. $resolved_directories = [];
  14. $missing_dependencies = [];
  15. // Function to recursively resolve dependencies
  16. function resolve(array $dependencies, array &$resolved_directories, array &$missing_dependencies): void
  17. {
  18. foreach ($dependencies as $directory => $required_dependencies) {
  19. if (!is_dir($directory)) {
  20. $missing_dependencies[] = $directory;
  21. continue;
  22. }
  23. $resolved_directories[$directory] = $directory; // Resolve the current directory
  24. foreach ($required_dependencies as $required_directory) {
  25. if (!is_dir($required_directory)) {
  26. $missing_dependencies[] = $required_directory;
  27. } else {
  28. resolve([$required_directory => []], $resolved_directories, $missing_dependencies); // Recursively resolve the required directory
  29. }
  30. }
  31. }
  32. }
  33. resolve($dependencies, $resolved_directories, $missing_dependencies);
  34. // Handle missing dependencies with fallback
  35. if (!empty($missing_dependencies)) {
  36. $fallback_resolved = [];
  37. foreach ($missing_dependencies as $missing_dir) {
  38. if (!empty($fallback_directories)) {
  39. $fallback_resolved[$missing_dir] = $fallback_directories[array_rand($fallback_directories)]; // Randomly pick a fallback directory
  40. error_log("Using fallback directory for missing dependency: " . $missing_dir);
  41. } else {
  42. return ["error" => "No fallback directories provided for missing dependencies: " . implode(", ", $missing_dependencies)];
  43. }
  44. }
  45. //Merge resolved and fallback directories
  46. $resolved_directories = array_merge($resolved_directories, $fallback_resolved);
  47. }
  48. if (empty($resolved_directories)) {
  49. return ["error" => "No directories could be resolved. Check dependencies and fallback directories."];
  50. }
  51. return $resolved_directories;
  52. }
  53. //Example Usage
  54. /*
  55. $dependencies = [
  56. 'data' => ['db', 'processed'],
  57. 'reports' => ['data', 'processed'],
  58. 'scheduled_run' => ['reports']
  59. ];
  60. $fallback_directories = ['/var/www/fallback', '/opt/fallback'];
  61. $scheduled_run_path = '/var/www/scheduled_run';
  62. $resolved = resolveDependencies($dependencies, $fallback_directories, $scheduled_run_path);
  63. if (isset($resolved['error'])) {
  64. echo "Error: " . $resolved['error'];
  65. } else {
  66. echo "Resolved Directories:\n";
  67. print_r($resolved);
  68. }
  69. */
  70. ?>

Add your comment