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 相关文章推荐
phpinfo 系统查看参数函数代码
Jun 05 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
Aug 21 PHP
PHP实现定时执行任务的方法
Oct 05 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
php发送与接收流文件的方法
Feb 11 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
PHP基于DOMDocument解析和生成xml的方法分析
Jul 17 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 22 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中的字符串函数
2006/10/09 PHP
SSI指令
2006/11/25 PHP
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
python小技巧之批量抓取美女图片
2014/06/06 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
wxPython色环电阻计算器
2019/11/18 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
委托书范文
2014/04/02 职场文书
北京天坛导游词
2015/02/12 职场文书
社团招新宣传语
2015/07/13 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android