PHP可通过PCNTL扩展实现进程控制,如进程创建,信号处理,进程中断判断等。但只能在CLI模式下操作。
PCNTL的信号机制是基于 ticks 机制实现的。因此在使用信号相关函数时需要在前面添加declare(ticks = n) 语法结构。
pcntl_alarm ( int $seconds )指定秒数后向进程发送一个 SIGALRM 信号
pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ])给指定信号$signo设置回调函数
declare(ticks = 1);
function signal_handler($signal) {
print "Caught SIGALRM\n";
pcntl_alarm(3);
}
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(3);
for(;;) {
}
$dir = '/root/';
$cmd = 'ls';
$option = '-l';
$pathtobin = '/bin/ls';
$arg = array($cmd, $option, $dir);
pcntl_exec($pathtobin, $arg);
echo 'will not exec here';
$pid = pcntl_fork ();
//父进程和子进程都会执行下面代码
if ( $pid == -1 ) {
//错误处理:创建子进程失败时返回-1.
die( 'could not fork' );
} else if ( $pid ) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait ($status, WUNTRACED); //等待子进程中断,防止子进程成为僵尸进程。
echo "ok".PHP_EOL;
} else if ($pid == 0){
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
echo "子进程运行" . getmypid() .PHP_EOL;
sleep(5);
exit;
}
echo "父进程运行" . getmypid() .PHP_EOL;