function runChildProcesses(Config $config, OutputInterface $output, array $toProcess) { $error = false; $files = []; $groupSize = intval(count($toProcess) / $config->getProcessCount()); for ($i = 0; $i < $config->getProcessCount(); ++$i) { $group = $i == $config->getProcessCount() - 1 ? array_slice($toProcess, $groupSize * $i) : array_slice($toProcess, $groupSize * $i, $groupSize); file_put_contents("scan.tmp.{$i}", implode("\n", $group)); $cmd = escapeshellarg($GLOBALS['argv'][0]); $cmdLine = "php -d memory_limit=1G {$cmd} -a -s "; if ($config->getOutputFile()) { $outputFileName = $this->getMultipartFileName($config, $i); $cmdLine .= " -o " . escapeshellarg($outputFileName) . " "; } if ($config->getOutputLevel() == 1) { $cmdLine .= " -v "; } if ($config->getOutputLevel() == 2) { $cmdLine .= " -v -v "; } $cmdLine .= escapeshellarg($config->getConfigFileName()) . " " . escapeshellarg("scan.tmp.{$i}"); $output->outputExtraVerbose($cmdLine . "\n"); $file = popen($cmdLine, "r"); $files[] = $file; } while (count($files) > 0) { $readFile = $files; $empty1 = $empty2 = null; $count = stream_select($readFile, $empty1, $empty2, 5); if ($count > 0) { foreach ($readFile as $index => $file) { echo fread($file, 1000); if (feof($file)) { unset($files[array_search($file, $files)]); if (!$error) { $error = pclose($file) == 0; } $output->outputExtraVerbose("Child process completed\n"); } } } else { $output->output("T", "Timed out waiting for next file to scan"); } } for ($i = 0; $i < $config->getProcessCount(); ++$i) { unlink("scan.tmp.{$i}"); } return $error ? 1 : 0; }