PHP多進程編程(四) 用php實現管道通信類

實現代碼如下:


<?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);

    }

}

?>


有了這個類,就可以實現簡單的管道通信了,因爲這個教程是多進程編程系列教程的一個部分。

這個管道類的應用部分,將放到下一節。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章