PHPマルチスレッドプログラミングのパイプライン通信例分析


本論文の例はPHPマルチスレッドプログラミングのパイプライン通信の使い方を説明する。皆さんの参考にしてください。具体的な分析は以下の通りです。
スレッドは個人的な英雄主義であれば、マルチスレッドは集団主義であり、あなたはもはや独行侠ではなく、指揮者である。
パイプ通信:
1.配管は列と考えられますが、スレッドごとに中身を書いてもいいし、中から読んでもいいです。書きます
列の最後に追加します。読みは列の頭から削除します。
 
2.パイプの大きさは普通4 Kで、つまり4 Kを超えています。読むしかないです。中に書いてはいけません。
 
3.デフォルトでは、パイプラインを書き込んだら、彼のプログラムを読んでデータを読み終わるまで阻止されます。読み取りスレッドも停止されます。
   プロセスが配管にデータを書き込むまで。もちろん、あなたはこのようなデフォルトの属性を変えることができます。setblock  関数を使用して、非ブロッキングモードに設定します。
 
下は私が分けて入れたパイプの種類です。

<?php
class Pipe
{
  public $fifoPath;
  private $w_pipe;
  private $r_pipe;
 
  /**
   *         
   *
   * @param string $name     
   * @param int $mode      ,           
   */
  function __construct($name = 'pipe', $mode = 0666)
  {
    $fifoPath = "/tmp/$name." . posix_getpid();
    if (!file_exists($fifoPath)) {
      if (!posix_mkfifo($fifoPath, $mode)) {
        error("create new pipe ($name) error.");
        return false;
      }
    } else {
      error( "pipe ($name) has exit.");
      return false;
    }
    $this->fifoPath = $fifoPath;
  }
///////////////////////////////////////////////////
//        
///////////////////////////////////////////////////
  function open_write()
  {
    $this->w_pipe = fopen($this->fifoPath, 'w');
    if ($this->w_pipe == NULL) {
      error("open pipe {$this->fifoPath} for write error.");
      return false;
    }
    return true;
  }
 
  function write($data)
  {
    return fwrite($this->w_pipe, $data);
  }
 
  function write_all($data)
  {
    $w_pipe = fopen($this->fifoPath, 'w');
    fwrite($w_pipe, $data);
    fclose($w_pipe);
  }
 
  function close_write()
  {
    return fclose($this->w_pipe);
  }
/////////////////////////////////////////////////////////
///          
////////////////////////////////////////////////////////
  function open_read()
  {
    $this->r_pipe = fopen($this->fifoPath, 'r');
    if ($this->r_pipe == NULL) {
      error("open pipe {$this->fifoPath} for read error.");
      return false;
    }
    return true;
  }
  function read($byte = 1024)
  {
    return fread($this->r_pipe, $byte);
  }
  function read_all()
  {
    $r_pipe = fopen($this->fifoPath, 'r');
    $data = '';
    while (!feof($r_pipe)) {
      //echo "read one K
"; $data .= fread($r_pipe, 1024); } fclose($r_pipe); return $data; } function close_read() { return fclose($this->r_pipe); } /** * * * @return boolean is success */ function rm_pipe() { return unlink($this->fifoPath); } } ?> /* , 。*/
本論文で述べたように、皆さんのphpプログラムの設計に役に立ちます。