畫江湖之 PHP 多程式開發 【監控子程式防止意外中斷】

Krisji發表於2019-04-01

監控的目的

  • 想知道子程式的退出狀態
  • 想自動重啟
pcntl_wait      等待或返回fork的子程式狀態(任意)
                等同 pcntl_waitpid(-1, $status, 0)    都是等待任意子程式

pcntl_wtermsig  返回導致子程式中斷的訊號
<?php

echo "Master process id = " . posix_getpid() . PHP_EOL;

$childs = [];//定義一個全域性的子程式收集陣列

function fork() {//定義一個fork子程式函式
    global $childs;

    $pid = pcntl_fork();//fork 一個子程式

    switch ($pid) {
    case -1:
        die('Create failed');
        break;
    case 0:
        // Child
        echo "Child process id = " . posix_getpid() . PHP_EOL;

        while (true) {//死迴圈 執行任務
            sleep(5);
        }

        break;
    default:
        // Parent

        $childs[$pid] = $pid;//主程式 記錄子程式的程式id
        break;
    }
}

$count = 3;//fork 3個子程式

for ($i = 0; $i < $count; $i++) {
    fork();
}

while ( count($childs) ) {//監控
    if ( ($exit_id = pcntl_wait($status)) > 0 ) {//如果有子程式意外中斷了
        echo "Child({$exit_id}) exited.\n";
        echo "中斷子程式的訊號值是 " . pcntl_wtermsig($status) . PHP_EOL;//輸出中斷的訊號量
        unset($childs[$exit_id]);//把中斷的子程式的程式id 剔除掉
    }

    if ( count($childs) < 3 ) {//如果子程式的程式數量小於規定的數量
        fork();//重新開闢一個子程式
    }
}

echo "Done\n";

相關文章