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动态变静态原理
Nov 25 PHP
开发大型 PHP 项目的方法
Jan 02 PHP
PHP开发中常用的8个小技巧
Aug 27 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
php代码书写习惯优化小结
Jun 20 PHP
php socket实现的聊天室代码分享
Aug 16 PHP
PHP面向对象精要总结
Nov 07 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
php实现简单的MVC框架实例
Sep 23 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
PHP进程通信基础之信号
Feb 19 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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 魔术方法使用说明
2009/10/20 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
React组件生命周期详解
2017/07/03 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
Django实现文件上传下载
2019/10/06 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
用python读取xlsx文件
2020/12/17 Python
高分子材料个人求职信范文
2013/09/25 职场文书
网上卖盒饭创业计划书
2014/01/26 职场文书
网络研修随笔感言
2014/02/17 职场文书
停课通知书
2015/04/24 职场文书
化妆品促销活动总结
2015/05/07 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
导游词之上海豫园
2019/10/24 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript