成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PHP 多進(jìn)程系列筆記(三)

focusj / 2511人閱讀

摘要:本節(jié)講解幾個多進(jìn)程的實(shí)例。新開終端,我們使用命令查看進(jìn)程可以看到個進(jìn)程個主進(jìn)程,個子進(jìn)程。使用命令結(jié)束子進(jìn)程,主進(jìn)程會重新拉起一個新的子進(jìn)程。

本節(jié)講解幾個多進(jìn)程的實(shí)例。

多進(jìn)程實(shí)例 Master-Worker結(jié)構(gòu)

下面例子實(shí)現(xiàn)了簡單的多進(jìn)程管理:

支持設(shè)置最大子進(jìn)程數(shù)

Master-Worker結(jié)構(gòu):Worker掛掉,Master進(jìn)程會重新創(chuàng)建一個

 0){
    exit;//父進(jìn)程退出
}else{
    // 從當(dāng)前終端分離
    if (posix_setsid() == -1) {
        die("could not detach from terminal");
    }

    $id = getmypid();   
    echo time()." Master process, pid {$id}
"; 

    for($i=0; $i<$MAX_PROCESS;$i++){
        start_worker_process();
    }

    //Master進(jìn)程等待子進(jìn)程退出,必須是死循環(huán)
    while(1){
        foreach($pids as $pid){
            if($pid){
                $res = pcntl_waitpid($pid, $status, WNOHANG);
                if ( $res == -1 || $res > 0 ){
                    echo time()." Worker process $pid exit, will start new... 
";
                    start_worker_process();
                    unset($pids[$pid]);
                }
            }
        }
    }
}

/**
 * 創(chuàng)建worker進(jìn)程
 */
function start_worker_process(){
    global $pids;
    $pid = pcntl_fork();
    if($pid <0){
        exit("fork fail
");
    }elseif($pid > 0){
        $pids[$pid] = $pid;
        // exit; //此處不可退出,否則Master進(jìn)程就退出了
    }else{
        //實(shí)際代碼
        $id = getmypid();   
        $rand = rand(1,3);
        echo time()." Worker process, pid {$id}. run $rand s
"; 
        while(1){
            sleep($rand);
        }
    }
}

~~~防盜版聲明:本文系原創(chuàng)文章,發(fā)布于公眾號飛鴻影的博客(fhyblog)及博客園,轉(zhuǎn)載需作者同意?!?/p> 多進(jìn)程Server

下面我們使用多進(jìn)程實(shí)現(xiàn)一個tcp服務(wù)器,支持:

多進(jìn)程處理客戶端連接

子進(jìn)程退出,Master進(jìn)程會重新創(chuàng)建一個

支持事件回調(diào)

 0){
            exit;//父進(jìn)程退出
        } else{
            // 從當(dāng)前終端分離
            if (posix_setsid() == -1) {
                die("could not detach from terminal");
            }

            umask(0);

            $id = getmypid();   
            echo time()." Master process, pid {$id}
"; 

            //創(chuàng)建tcp server
            $this->socket = stream_socket_server("tcp://0.0.0.0:9201", $errno, $errstr);
            if(!$this->socket) exit("start server err: $errstr --- $errno");
        }
    }

    public function run(){
        for($i=0; $istart_worker_process();
        }

        echo "waiting client...
";

        //Master進(jìn)程等待子進(jìn)程退出,必須是死循環(huán)
        while(1){
            foreach($this->pids as $k=>$pid){
                if($pid){
                    $res = pcntl_waitpid($pid, $status, WNOHANG);
                    if ( $res == -1 || $res > 0 ){
                        echo time()." Worker process $pid exit, will start new... 
";
                        $this->start_worker_process();
                        unset($this->pids[$k]);
                    }
                }
            }
            sleep(1);//讓出1s時間給CPU
        }
    }

    /**
     * 創(chuàng)建worker進(jìn)程,接受客戶端連接
     */
    private function start_worker_process(){
        $pid = pcntl_fork();
        if($pid <0){
            exit("fork fail
");
        }elseif($pid > 0){
            $this->pids[] = $pid;
            // exit; //此處不可退出,否則Master進(jìn)程就退出了
        }else{
            $this->acceptClient();
        }
    }

    private function acceptClient()
    {
        //子進(jìn)程一直等待客戶端連接,不能退出
        while(1){
            $conn = stream_socket_accept($this->socket, -1);
            if($this->onConnect) call_user_func($this->onConnect, $conn); //回調(diào)連接事件

            //開始循環(huán)讀取消息
            $recv = ""; //實(shí)際收到消息
            $buffer = ""; //緩沖消息
            while(1){
                $buffer = fread($conn, 20);

                //沒有收到正常消息
                if($buffer === false || $buffer === ""){
                    if($this->onClose) call_user_func($this->onClose, $conn); //回調(diào)斷開連接事件
                    break;//結(jié)束讀取消息,等待下一個客戶端連接
                }

                $pos = strpos($buffer, "
"); //消息結(jié)束符
                if($pos === false){
                    $recv .= $buffer;                            
                }else{
                    $recv .= trim(substr($buffer, 0, $pos+1));

                    if($this->onMessage) call_user_func($this->onMessage, $conn, $recv); //回調(diào)收到消息事件

                    //客戶端強(qiáng)制關(guān)閉連接
                    if($recv == "quit"){
                        echo "client close conn
";
                        fclose($conn);
                        break;
                    }

                    $recv = ""; //清空消息,準(zhǔn)備下一次接收
                }
            }
        }
    }

    function __destruct() {
        @fclose($this->socket);
    }
}

$server =  new TcpServer();

$server->onConnect = function($conn){
    echo "onConnect -- accepted " . stream_socket_get_name($conn,true) . "
";
    fwrite($conn,"conn success
");
};

$server->onMessage = function($conn,$msg){
    echo "onMessage --" . $msg . "
";
    fwrite($conn,"received ".$msg."
");
};

$server->onClose = function($conn){
    echo "onClose --" . stream_socket_get_name($conn,true) . "
";
    fwrite($conn,"onClose "."
");
};

$server->run();

運(yùn)行:

$ php process_multi.server.php 
1528734803 Master process, pid 9110
waiting client...

此時服務(wù)端已經(jīng)變成守護(hù)進(jìn)程了。新開終端,我們使用ps命令查看進(jìn)程:

$ ps -ef | grep php
yjc       9110     1  0 00:33 ?        00:00:00 php process_multi.server.php
yjc       9111  9110  0 00:33 ?        00:00:00 php process_multi.server.php
yjc       9112  9110  0 00:33 ?        00:00:00 php process_multi.server.php
yjc       9113  9110  0 00:33 ?        00:00:00 php process_multi.server.php
yjc       9134  8589  0 00:35 pts/1    00:00:00 grep php

可以看到4個進(jìn)程:1個主進(jìn)程,3個子進(jìn)程。使用kill命令結(jié)束子進(jìn)程,主進(jìn)程會重新拉起一個新的子進(jìn)程。

然后我們使用telnet測試連接:

$ telnet 127.0.0.1 9201
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is "^]".
conn success
hello server!
received hello server!
quit
received quit
Connection closed by foreign host.

歡迎關(guān)注公眾號及時獲取最新文章推送!


推薦!每月僅需$2.5,即可擁有配置SSD的VPS!

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/28908.html

相關(guān)文章

  • PHP進(jìn)程系列筆記(一)

    摘要:用于創(chuàng)建子進(jìn)程。該函數(shù)阻塞當(dāng)前進(jìn)程,只到當(dāng)前進(jìn)程的一個子進(jìn)程退出或者收到一個結(jié)束當(dāng)前進(jìn)程的信號。注意處需要注意子進(jìn)程需要防止子進(jìn)程也進(jìn)入循環(huán)。如果沒有,最終創(chuàng)建的子進(jìn)程不只個。 本系列文章將向大家講解pcntl_*系列函數(shù),從而更深入的理解進(jìn)程相關(guān)知識。 PCNTL在PHP中進(jìn)程控制支持默認(rèn)是關(guān)閉的。您需要使用 --enable-pcntl 配置選項(xiàng)重新編譯PHP的 CGI或CLI版本...

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

    摘要:任何進(jìn)程在退出前使用退出都會變成僵尸進(jìn)程用于保存進(jìn)程的狀態(tài)等信息,然后由進(jìn)程接管。這時候就算手動結(jié)束腳本程序也無法關(guān)閉這個僵尸子進(jìn)程了。那么子進(jìn)程結(jié)束后,沒有回收,就產(chǎn)生僵尸進(jìn)程了。本小節(jié)我們通過安裝信號處理函數(shù)來解決僵尸進(jìn)程問題。 上一篇文章講解了pcntl_fork和pcntl_wait兩個函數(shù)的使用,本篇繼續(xù)講解PHP多進(jìn)程相關(guān)新知識。 僵尸(zombie)進(jìn)程 這里說下僵尸進(jìn)程...

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

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

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

    摘要:本節(jié)主要講解常用函數(shù)和進(jìn)程池的概念,也會涉及到守護(hù)進(jìn)程的知識。所以任何時候,建議預(yù)先創(chuàng)建好進(jìn)程,也就是使用進(jìn)程池的方式實(shí)現(xiàn)。 本節(jié)主要講解Posix常用函數(shù)和進(jìn)程池的概念,也會涉及到守護(hù)進(jìn)程的知識。本節(jié)難度較低。 Posix常用函數(shù) posix_kill 向指定pid進(jìn)程發(fā)送信號。成功時返回 TRUE , 或者在失敗時返回 FALSE 。 bool posix_kill ( int $...

    Cc_2011 評論0 收藏0
  • php創(chuàng)建恒定數(shù)量的進(jìn)程(pcntl學(xué)習(xí)筆記

    摘要:最近在學(xué)習(xí)進(jìn)程相關(guān)的知識,配合實(shí)際編碼,覺得有點(diǎn)意思。閑話不說了,進(jìn)入正題,受網(wǎng)友啟發(fā),如何創(chuàng)建恒定數(shù)量的進(jìn)程呢有進(jìn)程掛了,就創(chuàng)建新的,進(jìn)程,進(jìn)程多了就殺掉幾個。 最近在學(xué)習(xí)進(jìn)程相關(guān)的知識,配合實(shí)際編碼,覺得有點(diǎn)意思。這段時間工作不忙,有時間自己研究進(jìn)步,感覺這才是真正的工作啊。相比上一家公司(壓抑的工作飽和度……)感覺開心很多。下一步再研究一下多線程??纯茨懿荒懿迦胍磺f條數(shù)據(jù)。閑話...

    hizengzeng 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<