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 fsockopen写的HTTP下载的类
Feb 22 PHP
解析php中const与define的应用区别
Jun 18 PHP
PHP取二进制文件头快速判断文件类型的实现代码
Aug 05 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
9个比较实用的php代码片段
Mar 15 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
php操作路径的经典方法(必看篇)
Oct 04 PHP
对PHP依赖注入的理解实例分析
Oct 09 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
关于PHP中interface的用处详解
Jul 26 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
文章推荐系统(三)
2006/10/09 PHP
PHP安全配置
2006/12/06 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php中smarty区域循环的方法
2015/06/11 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
Python中工作日类库Busines Holiday的介绍与使用
2017/07/06 Python
Python面向对象之继承代码详解
2018/01/29 Python
python爬虫实例详解
2018/06/19 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
Django的models中on_delete参数详解
2019/07/16 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
行政助理岗位职责
2013/11/10 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书