Используя pcntl_fork, вы можете попробовать что-то вроде этого:
if (! function_exists('pcntl_fork')) {
throw new \RuntimeException('PCNTL functions not available on this PHP installation');
}
$commands = [];
foreach($inputDataGroups as $inputsForTask){
$json_string_input = json_encode($inputsForTask);
$filename = 'ImportApp_input_data_'.($group_no + 1).".json";
file_put_contents($filename,$json_string_input);
$commands[] = 'php worker.php "' . $filename . '"'.' ImportApp';
$group_no++;
}
// forking processes
$children = [];
foreach ($commands as $command) {
switch($pid = pcntl_fork()) {
case -1:
throw new \Exception("Unable to fork process");
break;
case 0:
// Child process
exec($command, $output, $exitCode);
// Child only need to execute command
exit($exitCode);
default:
$children[] = $pid;
break;
}
}
// Waiting for children to finish
foreach ($children as $pid) {
// We are still the parent.
pcntl_waitpid($pid, $status);
// Additional code handling none zero $status can be added here
}
Я не проверял это, но это хороший стартер
Примечание : Осторожно при использовании разветвления вы можете одновременно запустить слишком много процессов и унести с собой память или сервер.
Реализация максимального параллелизма при параллельной обработке - задача не из легких. Я создал свою собственную библиотеку для обработки параллелизма, в результате чего я потратил сотни часов на то, чтобы она работала, но мне не хватало критически важных функций, поэтому я оказался в tra sh, когда обнаружил процесс пасования / параллельный процесс, в котором реализованы все функции, которые мы требуется