意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

如何理解PHP信号量和共享内存的定义和实例

来源:恒创科技 编辑:恒创科技编辑部
2024-01-10 21:44:59
今天就跟大家聊聊有关“如何理解PHP信号量和共享内存的定义和实例”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“如何理解PHP信号量和共享内存的定义和实例”文章能对大家有帮助。


说明


如何理解PHP信号量和共享内存的定义和实例

1、信号量:是系统提供的一种原子操作,一个信号数量,同时只有一个进程能操作。

一个过程获得一个信号,必须被过程释放。

2、共享内存:是系统在存储器中打开的一个公共存储器区域,任何一个过程都可以访问。

在同一时刻,可以有多个过程访问该区域,为了保证数据的一致性,需要对该存储器区域进行锁定或信号。

实例

echo"parentprogresspid:{$parentPid}\n";
$childList=array();

//创建共享内存,创建信号量,定义共享key
$shm_id=ftok(__FILE__,'m');
$sem_id=ftok(__FILE__,'s');
$shareMemory=shm_attach($shm_id);
$signal=sem_get($sem_id);
constSHARE_KEY=1;
//生产者
functionproducer(){
global$shareMemory;
global$signal;
$pid=posix_getpid();
$repeatNum=5;
for($i=1;$i<=$repeatNum;$i++){
//获得信号量
sem_acquire($signal);

if(shm_has_var($shareMemory,SHARE_KEY)){
//有值,加一
$count=shm_get_var($shareMemory,SHARE_KEY);
$count++;
shm_put_var($shareMemory,SHARE_KEY,$count);
echo"({$pid})count:{$count}\n";
}else{
//无值,初始化
shm_put_var($shareMemory,SHARE_KEY,0);
echo"({$pid})count:0\n";
}
//用完释放
sem_release($signal);

$rand=rand(1,3);
sleep($rand);
}
}
functioncreateProgress($callback){
$pid=pcntl_fork();
if($pid==-1){
//创建失败
exit("forkprogresserror!\n");
}elseif($pid==0){
//子进程执行程序
$pid=posix_getpid();
$callback();
exit("({$pid})childprogressend!\n");
}else{
//父进程执行程序
return$pid;
}
}
//3个写进程
for($i=0;$i<3;$i++){
$pid=createProgress('producer');
$childList[$pid]=1;
echo"createproducerchildprogress:{$pid}\n";
}
//等待所有子进程结束
while(!empty($childList)){
$childPid=pcntl_wait($status);
if($childPid>0){
unset($childList[$childPid]);
}
}
//释放共享内存与信号量
shm_remove($shareMemory);
sem_remove($signal);
echo"({$parentPid})mainprogressend!\n";

推荐操作系统:windows7系统、PHP5.6、DELL G3电脑


关于“如何理解PHP信号量和共享内存的定义和实例”的内容今天就到这,感谢各位的阅读,大家可以动手实际看看,对大家加深理解更有帮助哦。如果想了解更多相关内容的文章,关注我们,恒创科技小编每天都会为大家更新不同的知识。

上一篇: PHP array_filter的作用和特性是什么 下一篇: 手机怎么远程登录云服务器?