<?php
\umask(0);
$pid = \pcntl_fork();
if (-1 === $pid) {
throw new Exception('Fork fail');
} elseif ($pid > 0) {
exit(0);
}
if (-1 === \posix_setsid()) {
throw new Exception("Setsid fail");
}
$pid = \pcntl_fork();
if (-1 === $pid) {
throw new Exception("Fork fail");
} elseif (0 !== $pid) {
exit(0);
}
$stdoutFile = __DIR__."/io.log";
global $STDERR, $STDOUT;
// 重定向標(biāo)準(zhǔn)輸出和錯誤輸出
fclose(STDOUT);
fclose(STDERR);
$STDOUT = fopen($stdoutFile, 'a');
$STDERR = fopen($stdoutFile, 'a');
for($i = 0; $i < 3; $i++)
{
$child_pid = pcntl_fork();
if($child_pid > 0)
{
// 主進(jìn)程
\cli_set_process_title('test Master: '.getmypid());
}else{
// 子進(jìn)程
\cli_set_process_title('test Sub: '.getmypid());
// break; // 使用break沒有問題
// 這里Worker.php源碼里面也是阻塞的
// 為什么我的這里使用阻塞,Master進(jìn)程會退出,子進(jìn)程變成孤兒了
while (1) {
$pid = getmypid();
$ppid = posix_getppid();
echo "pid:$pid --- ppid:$ppid".PHP_EOL;
sleep(5);
}
}
}
代碼是抽取Worker類的,搞不明白為什么主進(jìn)程會退出,求指點。