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
kill 6250当某个子进程意外退出时,守护进程会再自动创建一个新的子进程
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           Lance 的个人博客
 Lance 的个人博客
         
             
             
             
             
                     
                     
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: