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 相关文章推荐
来自phpguru得Php Cache类源码
Apr 15 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
ThinkPHP3.1新特性之字段合法性检测详解
Jun 19 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
项目中应用Redis+Php的场景
May 22 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 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/03/06 日漫
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
PHP中的str_repeat函数在JavaScript中的实现
2013/09/16 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
php图片添加水印例子
2016/07/20 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
学习vue.js计算属性
2016/12/03 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python连接DB2数据库
2016/08/27 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
简单了解python PEP的一些知识
2019/07/13 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python3实现绘制二维点图
2019/12/04 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
寻找迷宫的一条出路,o通路;X:障碍
2016/07/10 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
社区学习十八大感想
2014/01/22 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
python 单机五子棋对战游戏
2022/04/28 Python