国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php多進程通信,有名管道(pcntl學習 五)

newtrek / 1457人閱讀

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

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

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);
    }
    /**
     * 設置阻塞方式
     * 
     * @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);
        }
        // 設置阻塞類型
        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;
    }
    /**
     * 讀取所有的內容
     */
    public function readAll()
    {
        $hd = $this->handler;
        $data = "";
        while (!feof($hd)) {
            $data .= fread($hd,1024);
        }
        return $data;
    }
    /**
     * 寫入數據
     */
    public function write($data)
    {
        $hd = $this->handler;
        try {
            fwrite($hd,$data);
        } catch(Exception $e) {
            $this->throwException($e->getMessage());
        }
        return $this;
    }
    /**
     * 關閉管道
     */
    public function close()
    {
        return fclose($this->handler);
    }
    /**
     * 刪除管道
     */
    public function remove()
    {
        return unlink($this->path);
    }
    
}

多進程處理類,利用管道保存各個進程的返回結果,主進程處理最后的結果

process  = $process;
    }
    /**
     * 設置子進程
     */
    public function setProcess($process)
    {
        $this->process = $process;
    }
    /**
     * fork 子進程
     */
    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;
    }
    /**
     * 等待子進程結束
     */
    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;
    }
    /**
     * 獲取返回結果
     */
    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);

運行結果如下:

Array
(
    [0] => age pid:7436

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

)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22794.html

相關文章

  • PHP回顧之進程編程

    摘要:多進程中與多進程相關的兩個重要拓展是和。函數執行期間,主進程除了等待無法處理其他任務,所以一般不認為這是多進程編程。回收子進程有兩種方式,一種是主進程調用函數等待子進程結束另外一種是處理信號。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 session 數據庫操作 加解...

    lifesimple 評論0 收藏0
  • PHP進程系列筆記(

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

    qianfeng 評論0 收藏0
  • 從0到1優雅的實現PHP進程管理

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

    lakeside 評論0 收藏0
  • PHP 命令行方式實現異步進程模式的任務處理

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

    Invoker 評論0 收藏0
  • PHP 進程的實現與管理

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

    MockingBird 評論0 收藏0

發表評論

0條評論

newtrek

|高級講師

TA的文章

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