Home > Article > Backend Development > Application of PHP multi-threaded pipeline communication
This article mainly introduces pipeline communication in PHP multi-thread programming. It analyzes the principle of pipeline communication and its use with examples. I hope it will be helpful to everyone's understanding of pipeline communication.
If one thread is individual heroism, then multiple threads are collectivism. You are no longer a lone ranger, but a conductor.
Pipeline communication:
1. A pipeline can be thought of as a queue, and different threads can write things to it and read things from it. Writing means adding
at the end of the queue, and reading means deleting at the head of the queue.
2. Pipes generally have a size, and the default is generally 4K. That is, if the content exceeds 4K, you can only read it and cannot write to it.
3. By default, after writing to the pipe, it will be blocked until the program that reads it has finished reading the data. The reading thread will also be blocked until a process writes data to the pipe. Of course, you can change this default attribute and use the stream_set_block function to set it to non-blocking mode.
The following is a pipe class that I encapsulated (there is a problem with the naming of this class, it is not unified, and there is no time to change it to a unified one. I usually write the test code first and encapsulate it last, so the naming may not be unified) :
<?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); } } ?> /* 有了这个类,就可以实现简单的管道通信了。*/
Related recommendations:
Understand the magical use of php multi-threading
Detailed explanation of PHP multi-threading
##php inter-process communication--named pipe
The above is the detailed content of Application of PHP multi-threaded pipeline communication. For more information, please follow other related articles on the PHP Chinese website!