注意两点:
1. 子进程最好有一个 exit;语句,防止不必要的出错;
2. pcntl_fork 间最好不要有其它语句,例如:
$pid = pcntl_fork();
//这里最好不要有其他的语句
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
}
5. pcntl_wait ( int &$status [, int $options ] )
阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使
用
$status 返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:
1. 阻塞方式调用的,函数返回值为子进程的 pid,如果没有子进程返回值为-1;
2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回 0。
6. pcntl_waitpid ( int $pid , int &$status [, int $options ] )
功能同 pcntl_wait,区别为 waitpid 为等待指定 pid 的子进程。当 pid 为-1 时 pcntl_waitpid
与
pcntl_wait 一样。在 pcntl_wait 和 pcntl_waitpid 两个函数中的$status 中存了子进程的状态
信
息
,
这
个
参
数
可
以
用
于
pcntl_wifexited
、
pcntl_wifstopped
、
pcntl_wifsignaled
、
pcntl_wexitstatus
、
pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid 这些函数。
例如:
$pid = pcntl_fork();
if($pid) {
pcntl_wait($status);
$id = getmypid();
echo “parent process,pid {$id}, child pid {$pid}n”;
}else{
$id = getmypid();
echo “child process,pid {$id}n”;
sleep(2);
}
?>
子进程在输出 child process 等字样之后 sleep 了 2 秒才结束,而父进程阻塞着直到子进程
退出之后才继续运行。
7. pcntl_getpriority ([ int $pid [, int $process_identifier ]] )
取得进程的优先级,即 nice 值,默认为 0,在我的测试环境的 linux 中(CentOS release
5.2 (Final)),优先级为-20 到 19,-20 为优先级最高,19 为最低。(手册中为-20 到 20)。
8. pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )
设置进程的优先级。
9. posix_kill