PHP多进程编程(四) 用php实现管道通讯类

实现代码以下:php


<?php
编程

class Pipeapp

{ide

    public  $fifoPath;函数

    private $w_pipe;this

    private $r_pipe;spa


    /**orm

     * 自动建立一个管道教程

     *进程

     * @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);

    }

}

?>


有了这个类,就能够实现简单的管道通讯了,由于这个教程是多进程编程系列教程的一个部分。

这个管道类的应用部分,将放到下一节。

相关文章
相关标签/搜索