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
php面向对象全攻略 (九)访问类型
Sep 30 PHP
一道关于php变量引用的面试题
Aug 08 PHP
php记录日志的实现代码
Aug 08 PHP
PHP 基于文件头的文件类型验证类函数
May 01 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
php无限遍历文件夹示例分享
Mar 04 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 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
discuz7 phpMysql操作类
2009/06/21 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
session 加入redis的实现代码
2016/07/15 PHP
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
vue-router 路由基础的详解
2017/10/17 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
Python代理抓取并验证使用多线程实现
2013/05/03 Python
讲解python参数和作用域的使用
2013/11/01 Python
Django验证码的生成与使用示例
2017/05/20 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
python 获取字符串MD5值方法
2018/05/29 Python
基于python绘制科赫雪花
2018/06/22 Python
Python全排列操作实例分析
2018/07/24 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python word转pdf代码实例
2019/08/16 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
UDP协议功能
2013/01/06 面试题
会计助理的岗位职责
2013/11/29 职场文书
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
新三好学生主要事迹
2014/01/23 职场文书
电视节目策划方案
2014/05/16 职场文书
中学教师师德承诺书
2014/05/23 职场文书
低碳环保口号
2014/06/12 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
元旦标语大全
2014/10/09 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js