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 相关文章推荐
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
解析php中的fopen()函数用打开文件模式说明
Jun 20 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 PHP
访问编码后的中文URL返回404错误的解决方法
Aug 20 PHP
PHP之autoload运行机制实例分析
Aug 28 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
CI框架整合smarty步骤详解
May 19 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
php输出反斜杠的实例方法
Sep 19 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 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
模板引擎正则表达式调试小技巧
2011/07/20 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
2020/08/05 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
东方通信股份有限公司VC面试题
2014/08/27 面试题
中学教师管理制度
2014/01/14 职场文书
高中生的自我评价
2014/03/04 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
债务纠纷起诉书
2015/05/20 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang