php進(jìn)程間通訊實(shí)例分析

字號:


    本文實(shí)例講述了php進(jìn)程間通訊的方法。分享給大家供大家參考,具體如下:
    php單進(jìn)程單線程處理批量任務(wù)太慢了,受不鳥了,但是php不能多線程,最終選擇了多進(jìn)程處理批量任務(wù).
    php多進(jìn)程主要使用for進(jìn)行分裂,然后利用的unix/linux的信號量進(jìn)行進(jìn)程間通訊.
    本例使用的是:生產(chǎn)者=>消費(fèi)者=>收集器,的模式.
    <?php
    // ===== 全局變量 =====
    // ipc進(jìn)程間通訊
    $key = ftok(__FILE__, "a");
    $queue = msg_get_queue($key);
    // 進(jìn)程ID
    $producer_pid = 0;
    $consumers_pid = array();
    $collector_pid = posix_getpid();
    // ===== 消費(fèi)者 =====
    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;
          }
          // 數(shù)據(jù)處理
          $n = intval($message);
          msg_send($queue, $collector_pid, $n * $n);
        }
        exit("consumer ok!\n");
      }
    }
    // ===== 產(chǎ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程序設(shè)計(jì)有所幫助。