PHP实现master-worker守护多进程

<?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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!