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

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 {}
 }}