php进程间通讯实例分析


Posted in PHP onJuly 11, 2016

本文实例讲述了php进程间通讯的方法。分享给大家供大家参考,具体如下:

php单进程单线程处理批量任务太慢了,受不鸟了,但是php不能多线程,最终选择了多进程处理批量任务.

php多进程主要使用for进行分裂,然后利用的unix/linux的信号量进行进程间通讯.

本例使用的是:生产者=>消费者=>收集器,的模式.

<?php
// ===== 全局变量 =====
// ipc进程间通讯
$key = ftok(__FILE__, "a");
$queue = msg_get_queue($key);
// 进程ID
$producer_pid = 0;
$consumers_pid = array();
$collector_pid = posix_getpid();
// ===== 消费者 =====
for ($i=0; $i < 2; $i++) {
  $consumer_pid = pcntl_fork();
  if ($consumer_pid == -1) {
    exit("could not fork!\n");
  } else if ($consumer_pid) {
    // pcntl_wait($status);
    echo "consumer_pid: $consumer_pid\n";
    $consumers_pid[] = $consumer_pid;
  } else {
    $pid = posix_getpid();
    echo "consumer_pid: $pid start\n";
    while (true) {
      msg_receive($queue, $pid, $msgtype, 1024, $message);
      if ($message == "exit") {
        break;
      }
      // 数据处理
      $n = intval($message);
      msg_send($queue, $collector_pid, $n * $n);
    }
    exit("consumer ok!\n");
  }
}
// ===== 产生者 =====
$producer_pid = pcntl_fork();
if ($producer_pid == -1) {
  exit("could not fork!\n");
} else if ($producer_pid) {
  // pcntl_wait($status);
  echo "producer_pid: $producer_pid\n";
} else {
  $pid = posix_getpid();
  echo "producer_pid: $pid start\n";
  $n = 0;
  for ($i=0; $i < 10; $i++) {
    foreach ($consumers_pid as $consumer_pid) {
      $n++;
      msg_send($queue, $consumer_pid, $n);
    }
    sleep(1);
  }
  foreach ($consumers_pid as $consumer_pid) {
    msg_send($queue, $consumer_pid, "exit");
  }
  sleep(1);
  msg_send($queue, $collector_pid, "exit");
  exit("producer ok!\n");
}
// ===== 收集器 =====
while (true) {
  msg_receive($queue, $collector_pid, $msgtype, 1024, $message);
  if ($message == "exit") {
    break;
  }
  echo sprintf("% 5d: %d\n", $msgtype, $message);
}
exit("collector ok!\n");

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
PHP音乐采集(部分代码)
Feb 14 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
php生成EAN_13标准条形码实例
Nov 13 PHP
php实现在线生成条形码示例分享(条形码生成器)
Dec 30 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
Nov 15 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
php计算一个文件大小的方法
Mar 30 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
Oct 29 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
Adnroid 微信内置浏览器清除缓存
Jul 11 #PHP
php通过两层过滤获取留言内容的方法
Jul 11 #PHP
php基于openssl的rsa加密解密示例
Jul 11 #PHP
PHP微信开发用Cache 解决数据缓存
Jul 11 #PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 #PHP
[原创]smarty简单模板变量输出方法
Jul 09 #PHP
[原创]php简单防盗链验证实现方法
Jul 09 #PHP
You might like
新版PHP极大的增强功能和性能
2006/10/09 PHP
php生成xml简单实例代码
2009/12/16 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
Vue.use源码分析
2017/04/22 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
用webAPI实现图片放大镜效果
2020/11/23 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
python实现网页录音效果
2020/10/26 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
《观舞记》教学反思
2014/04/16 职场文书
优质服务活动实施方案
2014/05/02 职场文书
模具专业求职信
2014/06/26 职场文书
任命通知范文
2015/04/21 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
60句有关成长的名言
2019/09/04 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android