php进程间通讯实例分析

5年以前  |  阅读数:478 次  |  编程语言:PHP 

本文实例讲述了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网络编程技巧总结》、《PHP基本语法入门教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例