PHP函数pcntl_fork的理解与应用

PHP进程分支函数

php社区对pcntl_fork的解释如下

pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。
-------
pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。
------
成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。

第一次看到这里,是非常容易迷惑的,写的示例也看不明白.

其实这里有一个很简单的方法可以立即理解这个函数

这里写图片描述
php内部究竟是怎么处理pcntl_fork的,并不重要,只要理解了这里pid的值即可.

基于以上,本人写了一段workman的进程创建代码,以供参考

workman的pcntl_fork部分代码(精简)

<?php

$work = new work();
work::forkWorks();
print_r(work::$_works);
print_r(work::$pidMap);

class work {

    public static $_works = array();
    public static $pidMap = array();
    public $workId = 0;
    public $count = 4;
//    public $masterPid = 0;

    public function __construct() {
        $this->workId = spl_object_hash($this);//生成对象的唯一ID
        self::$_works[$this->workId] = $this;
        self::$pidMap[$this->workId] = array();
//        $this->masterPid = posix_getpid();
    }

    public static function forkWorks() {
        foreach (self::$_works as $work) {
            while (count(self::$pidMap[$work->workId]) < $work->count) {
                self::forkOne($work);
            }
        }
    }

    public static function forkOne($work) {
        $pid = pcntl_fork(); //从这句话执行完,就分成两个进程,主进程(pid>0)和子进程(pid=0),两个进程获取到的pid不同
        if ($pid > 0) {
            self::$pidMap[$work->workId][$pid] = $pid;
        } elseif ($pid == 0) {
            self::$_works[$work->workId] = $work;
            self::$pidMap = array();
            while (TRUE){//这里写了死循环
                sleep(1);
                ECHO 1;
            }
            exit;
        } else {

        }
    }

}

猜你喜欢

转载自blog.csdn.net/kk1946n/article/details/78252567