Heim > Artikel > Backend-Entwicklung > Anwendung der PHP-Multithread-Pipeline-Kommunikation
Dieser Artikel stellt hauptsächlich die Pipeline-Kommunikation in der PHP-Multithread-Programmierung vor. Er analysiert das Prinzip der Pipeline-Kommunikation und ihre Verwendung anhand von Beispielen. Ich hoffe, dass er zum Verständnis der Pipeline-Kommunikation beiträgt.
Wenn ein Thread individueller Heldentum ist, dann sind mehrere Threads Kollektivismus. Du bist kein Einzelkämpfer mehr, sondern ein Dirigent.
Pipeline-Kommunikation:
1. Eine Pipeline kann man sich als eine Warteschlange vorstellen, in die verschiedene Threads Dinge schreiben und daraus lesen können. Schreiben bedeutet,
am Ende der Warteschlange hinzuzufügen, und Lesen bedeutet, es am Anfang der Warteschlange zu löschen.
2. Pipes haben im Allgemeinen eine Größe und der Standardwert ist im Allgemeinen 4 KB. Das heißt, wenn der Inhalt 4 KB überschreitet, können Sie ihn nur lesen und nicht darauf schreiben.
3. Standardmäßig wird das Schreiben in die Pipe blockiert, bis das Programm, das sie liest, das Lesen der Daten abgeschlossen hat. Der Lesethread wird ebenfalls blockiert,
bis ein Prozess Daten in die Pipe schreibt. Natürlich können Sie dieses Standardattribut ändern und die Funktion stream_set_block verwenden, um es in den nicht blockierenden Modus zu versetzen.
Das Folgende ist eine Pipe-Klasse, die ich gekapselt habe (es gibt ein Problem mit der Benennung dieser Klasse, sie ist nicht einheitlich und es bleibt keine Zeit, sie in eine einheitliche Klasse zu ändern. Normalerweise schreibe ich den Test Code zuerst und kapseln Sie ihn zuletzt, sodass die Benennung möglicherweise nicht einheitlich ist):
<?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\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); } } ?> /* 有了这个类,就可以实现简单的管道通信了。*/
Verwandte Empfehlungen:
Verstehen Sie die Magie von PHP-Multithreading
Detaillierte Erklärung von PHP-Multithreading
PHP-Interprozesskommunikation - berühmte Pipes
Das obige ist der detaillierte Inhalt vonAnwendung der PHP-Multithread-Pipeline-Kommunikation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!