成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php多進(jìn)程通信,有名管道(pcntl學(xué)習(xí) 五)

newtrek / 1467人閱讀

摘要:對于多進(jìn)程間的通信,研究了一天的管道,封裝了一個管道類,以及處理多進(jìn)程的類。管道的理論,后期再補上,先上代碼。

對于多進(jìn)程間的通信,研究了一天的管道,封裝了一個管道類,以及處理多進(jìn)程的類。管道的理論,后期再補上,先上代碼。

path = $path;
                return $this;
            }
        }
        if (posix_mkfifo($path,$mode)) {
            $this->path = $path;
            return $this;
        } else {
            $this->throwException("create pipe failed");
        }
    }
    /**
     * 拋異常方法
     */
    public function throwException($msg = "failed")
    {
        throw new Exception($msg);
    }
    /**
     * 設(shè)置阻塞方式
     * 
     * @param   bool   $block false為非阻塞,true為阻塞
     */
    public function setBlock($block = false)
    {
        $this->block = $block;
    }
    /**
     * 指定pipe文件路徑
     */
    public function setPath($path)
    {
        if (!file_exists($path)) {
            $msg = $path." pipe  does not exists";
            $this->throwException($msg);
        }
        $this->path = $path;
    }
    /**
     * 獲取pipe文件路徑
     */
    public function getPath()
    {
        return $this->path;
    }
    /**
     * 打開一個管道
     *
     * @param   string   $mode  打開類型
     */
    public function pipeOpen($mode = "r")
    {
        $handler = fopen($this->path, $mode);
        if (!is_resource($handler)) {
            $msg = "open pipe ".$this->path." falied";
            $this->throwException($msg);
        }
        // 設(shè)置阻塞類型
        stream_set_blocking($handler, $this->block);
        $this->handler = $handler;
        return $this;
    }
    /**
     * 已讀的方式打開管道
     *
     * @return resource
     */
    public function readOpen()
    {
        return $this->pipeOpen("r");
    }
    /**
     * 已寫的方式打開管道
     *
     * @return resource
     */
    public function writeOpen()
    {
        return $this->pipeOpen("w");
    }
    /**
     * 讀取一行,或給定的長度
     */
    public function readOne($byte = 1024)
    {
        $data = fread($this->handler,$byte);
        return $data;
    }
    /**
     * 讀取所有的內(nèi)容
     */
    public function readAll()
    {
        $hd = $this->handler;
        $data = "";
        while (!feof($hd)) {
            $data .= fread($hd,1024);
        }
        return $data;
    }
    /**
     * 寫入數(shù)據(jù)
     */
    public function write($data)
    {
        $hd = $this->handler;
        try {
            fwrite($hd,$data);
        } catch(Exception $e) {
            $this->throwException($e->getMessage());
        }
        return $this;
    }
    /**
     * 關(guān)閉管道
     */
    public function close()
    {
        return fclose($this->handler);
    }
    /**
     * 刪除管道
     */
    public function remove()
    {
        return unlink($this->path);
    }
    
}

多進(jìn)程處理類,利用管道保存各個進(jìn)程的返回結(jié)果,主進(jìn)程處理最后的結(jié)果

process  = $process;
    }
    /**
     * 設(shè)置子進(jìn)程
     */
    public function setProcess($process)
    {
        $this->process = $process;
    }
    /**
     * fork 子進(jìn)程
     */
    public function forkProcess()
    {
        $process  = $this->process;
        foreach($process as $k => $item) {
            $pid = pcntl_fork();
            if ($pid ==  0) {
                $pipe = new fifoPipeClass();
                $id = getmypid();
                $pipe->writeOpen();
                $pipe->write($k." pid:".$id.PHP_EOL);
                $pipe->close();
                exit(0);
            } else if ($pid > 0) {
                $this->child[] = $pid;
            }
        }
        return $this;
    }
    /**
     * 等待子進(jìn)程結(jié)束
     */
    public function waiteProcess()
    {
        $child = $this->child;
        $pipe  = new fifoPipeClass();
        $pipe->readOpen();
        echo "get all begin".PHP_EOL;
        while(count($child)) {
            foreach($child as $k => $pid){
                $res = pcntl_waitpid($pid,$status,WNOHANG);
                if ( -1 == $res || $res > 0 ) {
                    unset($child[$k]);
                }
            }
            $data = $pipe->readOne();
            if ($data) {
                $this->result[] = $data;
            }
        }
        $pipe->close();
        echo "get all end".PHP_EOL;
        $pipe->remove();
        return $this;
    }
    /**
     * 獲取返回結(jié)果
     */
    public function getResult()
    {
        return $this->result;
    }
}
$obj = new pipeMultiProcess();
$obj->setProcess(["name"=>1,"age"=>2,"sex"=>3]);
$res = $obj->forkProcess()->waiteProcess()->getResult();
print_r($res);

運行結(jié)果如下:

Array
(
    [0] => age pid:7436

    [1] => sex pid:7437
name pid:7435

)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/22794.html

相關(guān)文章

  • PHP回顧之進(jìn)程編程

    摘要:多進(jìn)程中與多進(jìn)程相關(guān)的兩個重要拓展是和。函數(shù)執(zhí)行期間,主進(jìn)程除了等待無法處理其他任務(wù),所以一般不認(rèn)為這是多進(jìn)程編程?;厥兆舆M(jìn)程有兩種方式,一種是主進(jìn)程調(diào)用函數(shù)等待子進(jìn)程結(jié)束另外一種是處理信號。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應(yīng) session 數(shù)據(jù)庫操作 加解...

    lifesimple 評論0 收藏0
  • PHP進(jìn)程系列筆記(

    摘要:消息隊列更常見的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費執(zhí)行。子進(jìn)程前面加了個,這是為了防止父進(jìn)程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴展實現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...

    qianfeng 評論0 收藏0
  • 從0到1優(yōu)雅的實現(xiàn)PHP進(jìn)程管理

    摘要:目的綜上所述,我的目標(biāo)就是實現(xiàn)基于模式實現(xiàn)的多進(jìn)程管理工具。備注下文中,父進(jìn)程統(tǒng)稱為子進(jìn)程統(tǒng)稱為。最后我們通過下圖來簡單的總結(jié)和描述這個多進(jìn)程實現(xiàn)的過程控制上面實現(xiàn)了多進(jìn)程和多進(jìn)程的常駐內(nèi)存,那如何去管理呢答案多進(jìn)程通信。 _ | | _ __ __ _ _ __...

    lakeside 評論0 收藏0
  • PHP 命令行方式實現(xiàn)異步進(jìn)程模式的任務(wù)處理

    摘要:定義任務(wù)處理方法。讀取來自命令行的參數(shù),開始執(zhí)行任務(wù)。該函數(shù)有兩個參數(shù)和,是引用類型,用來存儲子進(jìn)程的狀態(tài),有兩個可選常量,分別表示不等待子進(jìn)程結(jié)束立即返回和等待子進(jìn)程結(jié)束。 用PHP來實現(xiàn)異步任務(wù)一直是個難題,現(xiàn)有的解決方案中:PHP知名的異步框架有 swoole 和 Workerman,但都是無法在 web 環(huán)境中直接使用的,即便強行搭建 web 環(huán)境,異步調(diào)用也是使用多進(jìn)程模式實...

    Invoker 評論0 收藏0
  • PHP 進(jìn)程的實現(xiàn)與管理

    摘要:運行模式實現(xiàn)進(jìn)程前,需了解常見的的運行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進(jìn)程則是使用命令行模式運行的基本實現(xiàn)中提供了一個擴展,可以利用操作系統(tǒng)的調(diào)用來實現(xiàn)多進(jìn)程。 應(yīng)用場景 一些耗時任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個常駐內(nèi)存的任務(wù)管理工具,為了保證實時性,一方面我們讓它一直執(zhí)行任...

    MockingBird 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<