PHP进程通信基础之信号量与共享内存通信


Posted in PHP onFebruary 19, 2017

由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂。由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误。信号量这个名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。

semaphore 英[ˈseməfɔ:(r)] vt. 发出信号,打旗语;

类似于指挥官的作用。

下面我们看下一个伪代码信号量的使用。

1、创建信号量唯一标识符

$ftok = ftok(__FILE__, 'a');

2、创建信号量资源ID

$sem_resouce_id = sem_get($ftok);

3、接受信号量

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);die(); resource(4) of type (sysvshm)
const SHARE_KEY = 1;
$child_list = [];

//加入信号量
$sem_id = ftok(__FILE__, 'b');
$signal = sem_get($sem_id);

//$signal resource(5) of type (sysvsem)


for ($i = 0; $i < 3; $i++) {
  $pid = pcntl_fork();
  if ($pid == -1) {
    exit("Fork fail!".PHP_EOL);
  } elseif ($pid == 0) {
    //获取信号量
    sem_acquire($signal);
    if (shm_has_var($shm_id,SHARE_KEY)) {
      $count = shm_get_var($shm_id, SHARE_KEY);
      $count++;
      //模拟业务处理
      $sec = rand(1, 3);
      sleep($sec);
      shm_put_var($shm_id, SHARE_KEY, $count);
    } else {
      $count = 0;
      $sec = rand(1, 3);
      sleep($sec);
      shm_put_var($shm_id, SHARE_KEY, $count);
    }

    echo "child process: ".getmypid()." is writing! now count is: $count ".PHP_EOL;

    //释放信号量
    sem_release($signal);
    exit("child process".getmypid()."end".PHP_EOL);
  } else {
    $child_list[] = $pid;
  }
}

while (count($child_list) > 0) {
  foreach ($child_list as $key => $pid) {
    $status = pcntl_waitpid($pid, $status);
    if ($status > 0 || $status == -1) {
      unset($child_list[$key]);
    }
  }
  sleep(1);
}

$count = shm_get_var($shm_id, SHARE_KEY);
echo " $count  ".PHP_EOL;

//销毁信号量
sem_remove($signal);

shm_remove($shm_id);
shm_detach($shm_id);
PHP 相关文章推荐
php防注
Jan 15 PHP
用PHP读取RSS feed的代码
Aug 01 PHP
php调用mysql数据 dbclass类
May 07 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 PHP
基于PHP开发中的安全防范知识详解
Jun 06 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
php实现有序数组旋转后寻找最小值方法
Sep 27 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
PHP进程通信基础之信号
Feb 19 #PHP
PHP 信号管理知识整理汇总
Feb 19 #PHP
php 三大特点:封装,继承,多态
Feb 19 #PHP
PHP实现大数(浮点数)取余的方法
Feb 18 #PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 #PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 #PHP
Zend Framework数据库操作技巧总结
Feb 18 #PHP
You might like
php eval函数一句话木马代码
2015/05/21 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
巧用canvas
2017/01/21 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
vue中使用cropperjs的方法
2018/03/01 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
Python 文件重命名工具代码
2009/07/26 Python
Python中正则表达式的详细教程
2015/04/30 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
Python中Qslider控件实操详解
2021/02/20 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书