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来处理多个提交任务
Oct 09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
Oct 25 PHP
php 数组排序 array_multisort与uasort的区别
Mar 24 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
基于php无限分类的深入理解
Jun 02 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
Jul 04 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
PHP Swoole异步MySQL客户端实现方法示例
Oct 24 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遍历数组的方法汇总
2015/04/30 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
js定时器实例分享
2016/12/20 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
详解Python的Django框架中的模版相关知识
2015/07/15 Python
python实现Windows电脑定时关机
2018/06/20 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
基于Python函数和变量名解析
2019/07/19 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
美国在线家装零售商:Build.com
2016/09/02 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
2014年安全员工作总结
2014/11/13 职场文书
满月酒邀请函
2015/01/30 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
如何写好开幕词?
2019/06/24 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js