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 相关文章推荐
删除无限级目录与文件代码共享
Jul 12 PHP
用PHP函数解决SQL injection
Dec 09 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
thinkphp模板用法和内容输出实例
Nov 28 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
php使用for语句输出三角形的方法
Jun 09 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP中trait使用方法详细介绍
May 21 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初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
Prototype源码浅析 Enumerable部分之each方法
2012/01/16 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
Python的几种主动结束程序方式
2019/11/22 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
python异常处理和日志处理方式
2019/12/24 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
解决python3输入的坑——input()
2020/12/05 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
使用HTML5的链接预取功能(link prefetching)给网站提速
2012/12/13 HTML / CSS
新书吧创业计划书
2014/01/31 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript