用PCNTL實現(xiàn)PHP多進程

PHP的進程控制支持實現(xiàn)了Unix方式的進程創(chuàng)建, 程序執(zhí)行, 信號處理以及進程的中斷叨襟。 進程控制不能被應(yīng)用在Web服務(wù)器環(huán)境揍魂,當其被用于Web服務(wù)環(huán)境時可能會帶來意外的結(jié)果。需要注意的是 PCNTL 是不支持在windows系統(tǒng)環(huán)境下使用的蚀浆。

  • PCNTL 多進程阻塞形式
<?php
$childProcessNum = 5;
for($i = 0; $i < $childProcessNum; ++$i) {
    $pids = pcntl_fork();
    if($pids == -1) {
        die('fork error');
    } else if ($pids) {
        pcntl_wait($status);
    } else {
        sleep(mt_rand(3,5));
        echo "{$i}\n";
        exit;
    }
}

在cli模式下執(zhí)行智厌,在終端可以看到會按順序來輸出每個執(zhí)行的進程的序號

picture
  • PCNTL 多進程非阻塞形式
    要使用非阻塞的多進程則只需要設(shè)置 pcntl_wait 的第二個參數(shù)為 WNOHANG 即可陈哑,即:
<?php
$childProcessNum = 5;
for($i = 0; $i < $childProcessNum; ++$i) {
    $pids = pcntl_fork();
    if($pids == -1) {
        die('fork error');
    } else if ($pids) {
        pcntl_wait($status, WNOHANG);
    } else {
        sleep(mt_rand(3,5));
        echo "{$i} - ";
        exit;
    }
}

pcntl_wait 在官方手冊中是這樣說明的:wait函數(shù)刮起當前進程的執(zhí)行直到一個子進程退出或接收到一個信號要求中斷當前進程或調(diào)用一個信號處理函數(shù)妻坝。 如果一個子進程在調(diào)用此函數(shù)時已經(jīng)退出(俗稱僵尸進程)伸眶,此函數(shù)立刻返回。子進程使用的所有系統(tǒng)資源將被釋放刽宪。

int pcntl_wait ( int &$status [, int $options = 0 ] )

pcntl_wait 這個函數(shù)有兩個參數(shù)厘贼,第二個參數(shù)的說明如下:

image

在cli模式下執(zhí)行修改后的代碼,可以看到腳本已經(jīng)執(zhí)行完畢了纠屋,不過子進程由于sleep的原因還沒執(zhí)行完涂臣,過了幾面才在終端輸出執(zhí)行結(jié)果。

此時用ps可以看到后臺有5個進程正在執(zhí)行:

image

執(zhí)行結(jié)果:

image
  • 配合 ticks 實現(xiàn)在同一時刻是控制進程數(shù)量
<?php
$maxProcess = 2;
$runningProcess = 0;
$arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

declare (ticks = 1);
pcntl_signal(SIGCHLD, function ($signo) {
    global $runningProcess;
    switch ($signo) {
        case SIGCHLD:
                $runningProcess--;
            break;
     }
});

for($i = 0; $i < 7; ++$i) {
    $runningProcess++;
    $pids = pcntl_fork();
    if($pids == -1) {
        die('fork error');
    } else if ($pids) {
        if ($runningProcess > $maxProcess) {
            pcntl_wait($status);
        }
    } else {
        sleep(mt_rand(3,4));
        echo "{$arr[$i]} \n";
        exit;
    }
}
  • 同一時刻控制子進程數(shù)量
<?php
$max = 3;
$child = 0;
$arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

function sig_handler($signo) {
    switch ($signo) {
        case SIGCHLD:
        echo "SIGCHLD received\n";
        $child--;
    }
}

pcntl_signal(SIGCHLD, "sig_handler");

for ($i=0; $i < 7; $i++) { 
    $child++;
    $pid=pcntl_fork();
    
    if ($pid == -1) {
        die("could not fork");
    } else if ($pid) {
        if ( $child >= $max ) pcntl_wait($status);
    } else {
        echo "\t Starting new child | now we de have $child child processes $arr[$i]\n";
        sleep(rand(4,5));
        exit;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末售担,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子署辉,更是在濱河造成了極大的恐慌族铆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哭尝,死亡現(xiàn)場離奇詭異哥攘,居然都是意外死亡,警方通過查閱死者的電腦和手機材鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門逝淹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桶唐,你說我怎么就攤上這事栅葡。” “怎么了尤泽?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵欣簇,是天一觀的道長。 經(jīng)常有香客問我坯约,道長熊咽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任闹丐,我火速辦了婚禮横殴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卿拴。我一直安慰自己衫仑,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布巍棱。 她就那樣靜靜地躺著惑畴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪航徙。 梳的紋絲不亂的頭發(fā)上如贷,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼杠袱。 笑死尚猿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的楣富。 我是一名探鬼主播凿掂,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纹蝴!你這毒婦竟也來了庄萎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤塘安,失蹤者是張志新(化名)和其女友劉穎糠涛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兼犯,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡忍捡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了切黔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸脊。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纬霞,靈堂內(nèi)的尸體忽然破棺而出凌埂,到底是詐尸還是另有隱情,我是刑警寧澤险领,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布侨舆,位于F島的核電站,受9級特大地震影響绢陌,放射性物質(zhì)發(fā)生泄漏挨下。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一脐湾、第九天 我趴在偏房一處隱蔽的房頂上張望臭笆。 院中可真熱鬧,春花似錦秤掌、人聲如沸愁铺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茵乱。三九已至,卻和暖如春孟岛,著一層夾襖步出監(jiān)牢的瞬間瓶竭,已是汗流浹背督勺。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斤贰,地道東北人智哀。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像荧恍,于是被迫代替她去往敵國和親瓷叫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容