php信号量和共享内存分别是什么


php信号量和共享内存分别是什么

文章插图
说明
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小编还为您精选了以下内容,希望对您有所帮助: