全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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进程通信之信号量浅析介绍  # PHP多进程通信-消息队列使用  # PHP进程通信基础之信号  # PHP进程间通信的几种方法详解  # 信号量  # 都要  # 时间内  # 博客  # 不容易  # 英文  # 只有一个  # 使我  # 可以使用  # 这篇  # 类似于  # 上厕所  # 在生活中  # 举个  # 能多  # 看其  # 莫名其妙  # 但说  # php  # pre 


相关文章: 建站之星后台密码如何安全设置与找回?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  如何快速搭建高效服务器建站系统?  魔方云NAT建站如何实现端口转发?  宝塔Windows建站如何避免显示默认IIS页面?  C#怎么创建控制台应用 C# Console App项目创建方法  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  javascript中的try catch异常捕获机制用法分析  英语简历制作免费网站推荐,如何将简历翻译成英文?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  网页设计网站制作软件,microsoft office哪个可以创建网页?  Python路径拼接规范_跨平台处理说明【指导】  焦点电影公司作品,电影焦点结局是什么?  如何快速生成凡客建站的专业级图册?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  专业网站建设制作报价,网页设计制作要考什么证?  如何在云主机上快速搭建网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  高端云建站费用究竟需要多少预算?  常州自助建站费用包含哪些项目?  *服务器网站为何频现安全漏洞?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  建站org新手必看:2024最新搭建流程与模板选择技巧  常州企业网站制作公司,全国继续教育网怎么登录?  如何高效完成独享虚拟主机建站?  高防服务器租用指南:配置选择与快速部署攻略  如何在宝塔面板中修改默认建站目录?  如何在万网自助建站中设置域名及备案?  广平建站公司哪家专业可靠?如何选择?  做企业网站制作流程,企业网站制作基本流程有哪些?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  高防服务器:AI智能防御DDoS攻击与数据安全保障  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何在橙子建站上传落地页?操作指南详解  浅析上传头像示例及其注意事项  在线制作视频网站免费,都有哪些好的动漫网站?  招贴海报怎么做,什么是海报招贴?  手机网站制作与建设方案,手机网站如何建设?  如何在阿里云购买域名并搭建网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何配置IIS站点权限与局域网访问?  家庭服务器如何搭建个人网站?  宝塔建站助手安装配置与建站模板使用全流程解析  如何选择高效响应式自助建站源码系统? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。