PHP进程通信基础
<?php $parentpid = posix_getpid();echo "parent progress pid:{$parentpid}\n";
//定义一个信号处理函数
function sighandler($signal) {
if ($signal == SIGINT) {
$pid = getmypid();
exit("{$pid} process, Killed!".PHP_EOL);
}
}
//phpversion < 5.3 .每执行一条低级指令,就检查一次是否出现该信号。效率损耗很大。
//declare(ticks=1);
$child_list = [];
//注册一个信号处理器。当发出该信号的时候对调用已定义的函数
pcntl_signal(SIGINT, 'sighandler');
for($i = 0; $i < 3; $i++) {
$pid = pcntl_fork();
if ($pid == 0) {
//子进程
while (true) {
//调用已安装的信号信号处理器,为了检测是否有新的信号等待dispatching
pcntl_signal_dispatch();
echo "I am child: ".getmypid(). " and i am running !".PHP_EOL;
sleep(rand(1,3));
}
} elseif($pid > 0) {
$child_list[] = $pid;
} else {
die('fork fail!'.PHP_EOL);
}
}
sleep(5);
foreach ($child_list as $key => $pid) {
posix_kill($pid, SIGINT);
}
sleep(2);
echo "{$parentpid} parent is end".PHP_EOL;
页:
[1]