PHP实现进程间通信:信号量

上一篇说了一下在PHP中利用systemv的消息队列进行子进程间的数据通信,这里介绍一下另外一种进程通信的方法:利用信号量. UNIX的IPC主要分为两大块,由AT&T主张的 system V IPC 和由BSD 主张的 socket.显然这些都是很好的东西,所以Linux把他们都完美的继承了下来. 有一张图可以清晰地显示出Linux的IPC体系. 上图非原创,socket也可以进行进程通信,但是一般不这么做. 和上一篇一样,pcntl 和 sysvshm 模块是必须的.pcntl只支持Linux和Unix,所以只能在Linux下进行:

<?php
//$key = ftok('ipc_sem.php', 's')
$key = ftok(__FILE__, 's');
$sem_id = sem_get($key, 1);
echo "This is a room,can only stay one people!\n\r";
// 派生子进程
$pid = pcntl_fork();
if ($pid<1) {
        exit('fork failed!');
} else if ($pid > 0) {
        $name = 'parent';
} else {
        $name = 'child';
}
echo "{$name} want to enter the room \n";
sem_acquire($sem_id);
echo "{$name} in the room , other people can't enter!\n";
sleep(3);//进程拿到信号量后等三秒.
echo "{$name} leave the room\n";
sem_release($sem_id);
if ($pid > 0) {
        pcntl_waitpid($pid, $status);
        sem_remove($sem_id);//移除信号量
}
?>

  运行结果如下: