PHP进程通信基础之信号量与共享内存通信
(编辑:jimmy 日期: 2025/10/26 浏览:3 次 )
由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂。由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误。信号量这个名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。
semaphore 英["htmlcode">
<"Fork fail!".PHP_EOL);
} elseif ($pid == 0) {
//获取信号量
sem_acquire($signal);
if (shm_has_var($shm_id,SHARE_KEY)) {
$count = shm_get_var($shm_id, SHARE_KEY);
$count++;
//模拟业务处理
$sec = rand(1, 3);
sleep($sec);
shm_put_var($shm_id, SHARE_KEY, $count);
} else {
$count = 0;
$sec = rand(1, 3);
sleep($sec);
shm_put_var($shm_id, SHARE_KEY, $count);
}
echo "child process: ".getmypid()." is writing! now count is: $count ".PHP_EOL;
//释放信号量
sem_release($signal);
exit("child process".getmypid()."end".PHP_EOL);
} else {
$child_list[] = $pid;
}
}
while (count($child_list) > 0) {
foreach ($child_list as $key => $pid) {
$status = pcntl_waitpid($pid, $status);
if ($status > 0 || $status == -1) {
unset($child_list[$key]);
}
}
sleep(1);
}
$count = shm_get_var($shm_id, SHARE_KEY);
echo " $count ".PHP_EOL;
//销毁信号量
sem_remove($signal);
shm_remove($shm_id);
shm_detach($shm_id);
下一篇:PHP进程通信基础之信号