基于PHP进程通信的信号量与共享内存通信
因为谁也不确定执行第一工序之间,这取决于内核的进程调度算法,这是更复杂的。它可能是多个进程可以在同一时间同时访问共享内存,造成不可预知的错误。信号量的名称是不可描述的,但它是很容易理解的其英文原文的意思。信号量(f):所有信号的返回量,信号量;
与指挥官的角色相似。
让我们看看下一个伪代码信号的用法。
1。为信号量创建唯一标识符
ftok美元= ftok(__file__,'a');
2。创建信号量资源id
sem_resouce_id = sem_get美元(美元ftok);
三.接收信号量
sem_acqure($ sem_resource_id);
4。信号的释放
sem_release($ sem_resource_id);
5。破坏信号
sem_remove($ sem_resource_id);
一个粗俗的例子让我们理解这个信号在生活中使用方便。经了解,它可以应用到我们的编程领域。
一个公司只有一个厕所,所以当有人去上厕所时,你必须得到一个锁(信号)来指示厕所是否在使用:
sem_acqure($ sem_resource_id);
当员工完成了厕所后,他们需要打开锁并释放锁(信号量),表明他们现在可以被允许使用:
sem_release($ sem_resource_id);
用一个简单的锁,我们可以知道当前的厕所(共享内存)是否可以使用。这个例子并不优雅,但它解释了这个问题。这个博客也是一个博客的味道,这是不容易的:
< PHP
创建共享内存区域
shm_key美元= ftok(__file__,'a');
$shm_id = shm_attach ($shm_key, 1024, 0755);
/ / var_dump($ shm_id);死();(4)资源类型(sysvshm)
const share_key = 1;
child_list美元= { };
信号
sem_id美元= ftok(__file__,'b');
美元($ sem_id)sem_get信号=;
/ / $信号源(5)式(sysvsem)
($ i = 0;$ i < 3;$ + +){
PID = pcntl_fork(美元);
如果($ = = 1){
退出(分叉失败!php_eol);
} elseif(PID = = 0美元){
获取/信号量
sem_acquire($信号);
如果(shm_has_var(shm_id美元,share_key)){
$count = shm_get_var(shm_id美元,share_key);
数+;
业务流程模拟
美元=兰特(1, 3);
睡眠(秒);
shm_put_var(shm_id美元,share_key,$count);
{人}
$=0;
美元=兰特(1, 3);
睡眠(秒);
shm_put_var(shm_id美元,share_key,$count);
}
回声孩子的过程:Getmypid()。正在写作!现在算是:php_eol美元计数;
释放
sem_release($信号);
退出(子进程(Getmypid)。结束。php_eol);
{人}
child_list美元{ } = $ PID;
}
}
而(计数($ child_list)> 0){
foreach(child_list美元美元美元关键= PID){
$状态= pcntl_waitpid($ PID,美元地位);
如果($状态> 0 | | $状态= = 1){
撤消($ child_list { $关键});
}
}
睡眠(1);
}
$count = shm_get_var(shm_id美元,share_key);
回声美元php_eol伯爵;
破坏信号量
sem_remove($信号);
shm_remove($ shm_id);
shm_detach($ shm_id);