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 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
实用函数2
Nov 08 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
深入apache host的配置详解
Jun 09 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
destoon整合ucenter后注册页面不跳转的解决方法
Jun 21 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
Symfony核心类概述
Mar 17 PHP
php 判断IP为有效IP地址的方法
Jan 28 PHP
laravel配置Redis多个库的实现方法
Apr 10 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
在同一窗体中使用PHP来处理多个提交任务
2008/05/08 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
Php图像处理类代码分享
2012/01/19 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
PHP静态成员变量
2017/02/14 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
使用jquery实现简单的ajax
2013/07/08 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
Sublime开发python程序的示例代码
2018/01/24 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
shell程序中如何注释
2012/01/28 面试题
社会学专业学生职业规划书
2014/02/07 职场文书
银行办公室岗位职责
2014/03/10 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
《藏戏》教学反思
2016/02/23 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
小程序实现文字循环滚动动画
2021/06/14 Javascript
php png失真的原因及解决办法
2021/10/24 PHP