declare(ticks=1);
$top_pid = pcntl_fork();
// 结束父进程,子进程继续执行
if ($top_pid) {
exit();
}
// 子进程脱离用户终端控制,成为新的会话组长
posix_setsid();
// 防止会话组长重新打开控制终端,再次创建子进程,并退出当前进程
$new_pid = pcntl_fork();
if ($new_pid) {
exit();
}
chdir('/') && umask(0);
$workers = array();
while (true) {
while (count($workers) >= 3) {
$child_pid = pcntl_wait($status);
if ($child_pid < 0) {
file_put_contents('/tmp/error.log', 'error_no:'.$status.';error_msg:'.pcntl_get_last_error());
}else{
$index = array_search($child_pid, $workers);
unset($workers[$index]);
}
}
$pid = pcntl_fork();
if ($pid) {
$workers[]=$pid;
continue;
}
// 子进程执行
sleep(20);
file_put_contents('/tmp/daemon.log', date('Y-m-d H:i:s').json_encode($workers).PHP_EOL,FILE_APPEND);
exit(0);
}
转载于:https://my.oschina.net/gzheng/blog/1533670