144 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @author Jenner <hypxm@qq.com>
							 | 
						||
| 
								 | 
							
								 * @blog http://www.huyanping.cn
							 | 
						||
| 
								 | 
							
								 * @license https://opensource.org/licenses/MIT MIT
							 | 
						||
| 
								 | 
							
								 * @datetime: 2015/11/24 16:29
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace Jenner\SimpleFork\Queue;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Pipe
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var resource
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $read;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var resource
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $write;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var string
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $filename;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @var bool
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $block;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @param string $filename fifo filename
							 | 
						||
| 
								 | 
							
								     * @param int $mode
							 | 
						||
| 
								 | 
							
								     * @param bool $block if blocking
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function __construct($filename = '/tmp/simple-fork.pipe', $mode = 0666, $block = false)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!file_exists($filename) && !posix_mkfifo($filename, $mode)) {
							 | 
						||
| 
								 | 
							
								            throw new \RuntimeException('create pipe failed');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (filetype($filename) != 'fifo') {
							 | 
						||
| 
								 | 
							
								            throw new \RuntimeException('file exists and it is not a fifo file');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->filename = $filename;
							 | 
						||
| 
								 | 
							
								        $this->block = $block;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function setBlock($block = true)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (is_resource($this->read)) {
							 | 
						||
| 
								 | 
							
								            $set = stream_set_blocking($this->read, $block);
							 | 
						||
| 
								 | 
							
								            if (!$set) {
							 | 
						||
| 
								 | 
							
								                throw new \RuntimeException('stream_set_blocking failed');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (is_resource($this->write)) {
							 | 
						||
| 
								 | 
							
								            $set = stream_set_blocking($this->write, $block);
							 | 
						||
| 
								 | 
							
								            if (!$set) {
							 | 
						||
| 
								 | 
							
								                throw new \RuntimeException('stream_set_blocking failed');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->block = $block;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * if the stream is blocking, you would better set the value of size,
							 | 
						||
| 
								 | 
							
								     * it will not return until the data size is equal to the value of param size
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param int $size
							 | 
						||
| 
								 | 
							
								     * @return string
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function read($size = 1024)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!is_resource($this->read)) {
							 | 
						||
| 
								 | 
							
								            $this->read = fopen($this->filename, 'r+');
							 | 
						||
| 
								 | 
							
								            if (!is_resource($this->read)) {
							 | 
						||
| 
								 | 
							
								                throw new \RuntimeException('open file failed');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (!$this->block) {
							 | 
						||
| 
								 | 
							
								                $set = stream_set_blocking($this->read, false);
							 | 
						||
| 
								 | 
							
								                if (!$set) {
							 | 
						||
| 
								 | 
							
								                    throw new \RuntimeException('stream_set_blocking failed');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return fread($this->read, $size);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @param $message
							 | 
						||
| 
								 | 
							
								     * @return int
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function write($message)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (!is_resource($this->write)) {
							 | 
						||
| 
								 | 
							
								            $this->write = fopen($this->filename, 'w+');
							 | 
						||
| 
								 | 
							
								            if (!is_resource($this->write)) {
							 | 
						||
| 
								 | 
							
								                throw new \RuntimeException('open file failed');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (!$this->block) {
							 | 
						||
| 
								 | 
							
								                $set = stream_set_blocking($this->write, false);
							 | 
						||
| 
								 | 
							
								                if (!$set) {
							 | 
						||
| 
								 | 
							
								                    throw new \RuntimeException('stream_set_blocking failed');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return fwrite($this->write, $message);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function __destruct()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->close();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function close()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (is_resource($this->read)) {
							 | 
						||
| 
								 | 
							
								            fclose($this->read);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (is_resource($this->write)) {
							 | 
						||
| 
								 | 
							
								            fclose($this->write);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function remove()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return unlink($this->filename);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |