declare(ticks = 1);
define("SIG_END", 50);
define("SIG_COMPLETE", 51);
$max = 5;
// function for signal handler
function sig_handler($signo) {
global $do;
switch ($signo) {
case SIG_END:
echo "Caught SIG_END...\n";
break;
case SIG_COMPLETE:
echo "Caught SIG_COMPLETE...\n";
$do = false;
break;
}
}
function exec_child($i) {
sleep(3);
echo "Child #".posix_getpid()."\n";
if ($i == 7) {
posix_kill(posix_getppid(), SIG_COMPLETE);
}
posix_kill(posix_getppid(), SIG_END);
}
// install signal handler for dead kids
pcntl_signal(SIG_END, "sig_handler");
pcntl_signal(SIG_COMPLETE, "sig_handler");
$pids = array();
$do = true;
while ($do) {
if (count($pids) >= $max) {
$child_pid = pcntl_waitpid(-1, $status);
unset($pids[array_search($child_pid, $pids)]);
}
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork!");
} elseif ($pid) {
$pids[] = $pid;
} else {
exec_child($i);
exit();
}
$i++;
}