文章插图
说明
1、信号量:是系统提供的一种原子操作,一个信号数量,同时只有一个进程能操作 。
一个过程获得一个信号,必须被过程释放 。
2、共享内存:是系统在存储器中打开的一个公共存储器区域,任何一个过程都可以访问 。
在同一时刻,可以有多个过程访问该区域,为了保证数据的一致性,需要对该存储器区域进行锁定或信号 。
实例
echo "parent progress pid:{$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);const SHARE_KEY = 1;// 生产者function producer(){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: 0n";}// 用完释放sem_release($signal);$rand = rand(1,3);sleep($rand);}}function createProgress($callback){$pid = pcntl_fork();if ( $pid == -1) {// 创建失败exit("fork progress error!n");} else if ($pid == 0) {// 子进程执行程序$pid = posix_getpid();$callback();exit("({$pid})child progress end!n");}else{// 父进程执行程序return $pid;}}// 3个写进程for ($i = 0; $i < 3; $i ++ ) {$pid = createProgress('producer');$childList[$pid] = 1;echo "create producer child progress: {$pid} n";}// 等待所有子进程结束while(!empty($childList)){$childPid = pcntl_wait($status);if ($childPid > 0){unset($childList[$childPid]);}}// 释放共享内存与信号量shm_remove($shareMemory);sem_remove($signal);echo "({$parentPid})main progress end!n";以上就是php信号量和共享内存的介绍,希望对大家有所帮助 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- tcp和udp的特点和区别 php中TCP和UDP的区别
- php psr规范 php PSR-4是什么意思
- hash加密算法有哪些 php Mhash算法的加密
- php用递归求n的阶乘 php中n阶乘的实现方法
- php垃圾收集机制怎么样的 php引用计数如何实现垃圾回收
- php require和include区别 php中require和include如何区分
- cookie加密方式 php中如何配置Cookie加密
- php 消息队列 php消息队列的介绍
- php zval PHP中Zval是什么
- php中Suhosin是什么