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