PHP函数pcntl_fork的理解与应用

来源:互联网 发布:linux系统shell 编辑:程序博客网 时间:2024/05/20 05:10

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 {        }    }}
原创粉丝点击