$i = 0;
while ($i < 2){
$pid = pcntl_fork();//父进程和子进程都会执行(包括此行)以下代码,只是父进程中返回创建的子进程ID,子进程中未创建进程所以返回0
if ($pid == -1) { // 创建子进程错误,返回-1
die('error');
} else if ($pid) {
// 父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait($status); // 挂起当前进程(就是下面的代码先不执行了),直到一个子进程退出,然后继续执行
$fork_id = $pid; // 子进程的ID或0
$pid = posix_getpid(); // 当前进程ID
$ppid = posix_getppid(); // 父进程ID
$time = microtime(true);
echo " parent fork_id:$fork_id pid:$pid ppid:$ppid i:$i $time \n";
} else {
// 子进程得到的$pid 为0,所以这里是子进程的逻辑
$fork_id = $pid; // 子进程的ID
$pid = posix_getpid();
$ppid = posix_getppid();
$time = microtime(true);
echo " child fork_id:$fork_id pid:$pid ppid:$ppid i:$i $time \n";
//exit;
//sleep(2);
}
$i++;
}
//498 parent
pcntl_fork(); //wait -4- parent fork_id:6499 pid:6498 ppid:3471 i:0 1491394182.2211
echo 1;
pcntl_fork();//wait -6- parent fork_id:6501 myid:6498 pid:6498 ppid:3471 i:1 1491394182.2302
echo 1;
/**
499 child parent
pcntl_fork(); -1- child fork_id:0 pid:6499 ppid:6498 i:0 1491394182.2065
echo 1;
pcntl_fork(); //wait -3- parent fork_id:6500 pid:6499 ppid:6498 i:1 1491394182.2143
echo 1;
*/
/**
500 child
pcntl_fork(); -2- child fork_id:0 pid:6500 ppid:6499 i:1 1491394182.2077
echo 1;
*/
/**
501 child
pcntl_fork(); -5- child fork_id:0 pid:6501 ppid:6498 i:1 1491394182.222
echo 1;
*/