Maison  >  Article  >  développement back-end  >  Application de la communication pipeline multithread PHP

Application de la communication pipeline multithread PHP

*文
*文original
2017-12-25 17:06:421735parcourir

Cet article présente principalement la communication pipeline dans la programmation multithread PHP. Il analyse les principes et les utilisations de la communication pipeline avec des exemples. J'espère qu'il sera utile à chacun pour comprendre la communication pipeline.

Si un fil conducteur est l'héroïsme individuel, alors plusieurs fils sont du collectivisme. Vous n'êtes plus un ranger solitaire, mais un chef d'orchestre.

Communication par pipeline :
1. Un pipeline peut être considéré comme une file d'attente, et différents threads peuvent y écrire des éléments et en lire des éléments. Écrire signifie ajouter
à la fin de la file d'attente, et lire signifie le supprimer en tête de la file d'attente.

2. Les tuyaux ont généralement une taille, et la valeur par défaut est généralement 4K. Autrement dit, si le contenu dépasse 4K, vous pouvez uniquement le lire et ne pouvez pas y écrire.

3. Par défaut, après avoir écrit dans le tube, il sera bloqué jusqu'à ce que le programme qui le lit ait fini de lire les données. Le thread de lecture sera également bloqué,
jusqu'à ce qu'un processus écrive des données dans le tube. Bien entendu, vous pouvez modifier cet attribut par défaut et utiliser la fonction stream_set_block pour le définir en mode non bloquant.

Ce qui suit est une classe de tuyaux que j'ai encapsulée (il y a un problème avec le nom de cette classe, elle n'est pas unifiée et je n'ai pas le temps de la changer en une classe unifiée. J'écris habituellement le test codez en premier et encapsulez-le en dernier, afin que le nom puisse ne pas être unifié) :


<?php
class Pipe
{
  public $fifoPath;
  private $w_pipe;
  private $r_pipe;
 
  /**
   * 自动创建一个管道
   *
   * @param string $name 管道名字
   * @param int $mode 管道的权限,默认任何用户组可以读写
   */
  function __construct($name = &#39;pipe&#39;, $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, &#39;w&#39;);
    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, &#39;w&#39;);
    fwrite($w_pipe, $data);
    fclose($w_pipe);
  }
 
  function close_write()
  {
    return fclose($this->w_pipe);
  }
/////////////////////////////////////////////////////////
/// 读管道相关函数开始
////////////////////////////////////////////////////////
  function open_read()
  {
    $this->r_pipe = fopen($this->fifoPath, &#39;r&#39;);
    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, &#39;r&#39;);
    $data = &#39;&#39;;
    while (!feof($r_pipe)) {
      //echo "read one K\n";
      $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);
  }
}
?>
 /*
有了这个类,就可以实现简单的管道通信了。*/

Recommandations associées :

Comprendre la magie du multi-threading PHP

Explication détaillée du multi-threading PHP

Communication inter-processus PHP - tubes célèbres


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn