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 相关文章推荐
第二节--PHP5 的对象模型
Nov 16 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
Jul 03 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 PHP
PHP批量删除jQuery操作
Jul 23 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
Jun 20 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
浅谈laravel框架与thinkPHP框架的区别
Oct 23 PHP
php操作redis数据库常见方法实例总结
Feb 20 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远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
Vue AST源码解析第一篇
2017/07/19 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
法制宣传实施方案
2014/03/13 职场文书
2014年母亲节寄语
2014/05/07 职场文书
项目经理岗位职责
2015/01/31 职场文书
小学教师读书笔记
2015/07/01 职场文书
小学生节约用水倡议书
2019/08/12 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
Java 数据结构七大排序使用分析
2022/04/02 Java/Android
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android