PHP實現master-worker守護多程式

Lance發表於2020-08-30
<?php
/**
 * master-worker守護多程式模式
 *
 */
class Worker
{

    //需要建立的子程式數量
    public static $count = 2;

    public static function main()
    {
        //建立主程式
        static::createMaster();
        //監控子程式
        static::watchProcess();
    }

    /**
     * 建立主程式
     */
    public static function createMaster()
    {
        $pid = pcntl_fork();
        //父程式和子程式都會執行下面程式碼
        //成功時,在父程式執行執行緒內返回產生的子程式的PID,在子程式執行執行緒內返回0。失敗時,在 父程式上下文返回-1,不會建立子程式,並且會引發一個PHP錯誤。
        if ($pid > 0) {
            echo "建立主程式 $pid \n";
            exit;

        } else if ($pid == 0) {
            //posix_setsid() 使當前程式成為會話的主程式,返回會話ID,如果錯誤則返回-1
            if (posix_setsid() === -1) {
                die("setsid 失敗");
            }
            //設定程式標題
            cli_set_process_title("master_process");
            //建立子程式
            for ($i = 0; $i < self::$count; $i++) {
                static::createWorker();
            }

        } else {
            die("建立主程式失敗");
        }
    }

    /**
     * 建立子程式
     */
    public static function createWorker()
    {
        $pid = pcntl_fork();
        if ($pid > 0) {
            echo "建立子程式 $pid \n";

        } else if ($pid == 0) {
            if (posix_setsid() === -1) {
                die("setsid 失敗");
            }
            //設定程式標題
            cli_set_process_title("worker_process");

            while (true) {
                //echo '當前程式id '.posix_getpid()." 執行中\n";
                sleep(2);
            }

        } else {
            die("建立子程式失敗");
        }
    }

    /**
     * 監控子程式
     */
    public static function watchProcess()
    {
        //pcntl_wait()返回退出的子程式程式號,發生錯誤時返回-1
        while ($pid = pcntl_wait($status)) {
            if ($pid == -1) {
                break;
            } else {
                static::createWorker();
            }
        }
    }
}

Worker::main();
php Worker.php
ps -ef|grep _process

PHP實現master-worker守護多程式

kill 6250

當某個子程式意外退出時,守護程式會再自動建立一個新的子程式
PHP實現master-worker守護多程式

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章