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.2中date()函数显示时间与北京时间相差8小时的解决办法
May 28 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
PHP json_decode函数详细解析
Feb 17 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
PHP智能识别收货地址信息实例
Jan 05 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
Feb 27 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 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/03/25 PHP
处理单名多值表单的详解
2013/06/08 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
javascript实现动态标签云
2015/10/16 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python中几个比较常见的名词解释
2015/07/04 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
电子商务个人自荐信
2013/12/12 职场文书
开学典礼感言
2014/02/16 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
反腐倡廉观后感
2015/06/08 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
利用python做表格数据处理
2021/04/13 Python
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js