findExpired(), ...$jobs->findOldFailed()] as $job) { foreach (['input_file' => Pipeline::incomingDir(), 'output_file' => Pipeline::storageDir()] as $field => $dir) { if (! empty($job[$field])) { $path = rtrim((string) $dir, '/') . '/' . basename((string) $job[$field]); if (is_file($path)) { $freed += (int) @filesize($path); @unlink($path); } } } $jobs->delete($job['id']); ++$deleted; } // orphaned files with no row (worker crash leftovers) $cutoff = time() - max(2, config('Site')->retentionHours) * 3600 - 600; foreach ([Pipeline::incomingDir(), Pipeline::storageDir()] as $dir) { foreach (glob(rtrim($dir, '/') . '/*') ?: [] as $file) { if (is_file($file) && filemtime($file) < $cutoff) { $freed += (int) @filesize($file); @unlink($file); } } } CLI::write("Cleanup: {$deleted} job row(s) removed, " . number_format($freed / 1048576, 1) . ' MB freed.', 'yellow'); } }