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 超链接 抓取实现代码
Jun 29 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
PHP大转盘中奖概率算法实例
Oct 21 PHP
ajax+php控制所有后台函数调用
Jul 15 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
Jan 07 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
Laravel学习教程之model validation的使用示例
Oct 23 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
新手学习PHP的一些基础知识分享
2011/07/27 PHP
php向js函数传参的几种方法
2014/08/10 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现SOM算法
2018/02/23 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
如何基于Python实现自动扫雷
2020/01/06 Python
如何在django中实现分页功能
2020/04/22 Python
python中列表的含义及用法
2020/05/26 Python
python中的对数log函数表示及用法
2020/12/09 Python
中学生演讲稿
2014/04/26 职场文书
社区党建工作方案
2014/06/10 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
写给导师的自荐信
2015/03/06 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python