function runProcessor()
{
$max_fork = 2;
$tasks = [
"test1" => "process1",
"test2" => "process2",
"test3" => "process3",
"test4" => "process4",
"test5" => "process5",
"test6" => "process6",
"test7" => "process7",
"test8" => "process8",
"test9" => "process9",
"test10" => "process10",
];
$pids = array();
$pid_count = 0;
foreach ( $tasks as $seq => $task ) {
$pids[$pid_count] = pcntl_fork();
switch($pids[$pid_count]) {
case "0":
return execute_task($task);
break;
case "-1":
echo "Unable to fork new process\n";
exit;
break;
default:
$pid_count++;
while( count( $pids ) >= $max_fork ) {
foreach( $pids as $key=>$pid ) {
$pid_status = "";
if( -1 == pcntl_waitpid( $pid, $pid_status, WNOHANG ) ) {
unset($pids[$key]);
continue;
}
}
usleep(200000);
}
break;
}
}
exit();
}
function execute_task($task_id) {
echo "Starting task: ${task_id}\n";
// Simulate doing actual work with sleep().
$execution_time = rand(5, 10);
sleep($execution_time);
echo "Completed task: ${task_id}. Took ${execution_time} seconds.\n";
exit();
}
runProcessor();