PHP多進程實例

<?php
header('content-type:text/html;charset=utf-8' );

// 必須加載擴展
if (!function_exists("pcntl_fork")) {
    die("pcntl extention is must !");
}
//總進程的數量
$totals = 3;
// 執行的腳本數量
$cmdArr = array();
// 執行的腳本數量的數組
for ($i = 0; $i < $totals; $i++) {
    $cmdArr[] = array("path" => __DIR__ . "/run.php",  'pid' =>$i ,'total' =>$totals);
}

/*
展開:$cmdArr
Array
(
    [0] => Array
        (
            [path] => /var/www/html/company/pcntl/run.php
            [pid] => 0
            [total] => 3
        )
    [1] => Array
        (
            [path] => /var/www/html/company/pcntl/run.php
            [pid] => 1
            [total] => 3
        )
    [2] => Array
        (
            [path] => /var/www/html/company/pcntl/run.php
            [pid] => 2
            [total] => 3
        )
)
*/

pcntl_signal(SIGCHLD, SIG_IGN);    //如果父進程不關心子進程什麼時候結束,子進程結束後,內核會回收。
foreach ($cmdArr  as   $cmd) {
    $pid = pcntl_fork();    //創建子進程
    //父進程和子進程都會執行下面代碼
    if ($pid == -1) {
        //錯誤處理:創建子進程失敗時返回-1.
        die('could not fork');
    } else if ($pid) { //這裏$pid>0
        //父進程會得到子進程號,所以這裏是父進程執行的邏輯
        //如果不需要阻塞進程,而又想得到子進程的退出狀態,則可以註釋掉pcntl_wait($status)語句,或寫成:
        pcntl_wait($status,WNOHANG); //等待子進程中斷,防止子進程成爲殭屍進程。
    } else { //這裏$pid=0
        //子進程得到的$pid爲0, 所以這裏是子進程執行的邏輯。
        $path   = $cmd["path"];
        $pid = $cmd['pid'] ;
        $total = $cmd['total'] ;
        echo exec("/usr/bin/php {$path} {$pid} {$total}")."\n";
        exit(0) ;
    }
}
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章