php-pcntl函数记录
pcntl_fork
官方文档摘录:
1 (PHP 4 >= 4.1.0, PHP 5, PHP 7) 3 pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。 4 5 说明 6 pcntl_fork ( void ) : int 7 pcntl_fork()函数创建一个子进程,这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同。fork怎样在您的系统工作的详细信息请查阅您的系统 的fork(2)手册。 8 9 返回值 10 成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。 11 12 范例 13 Example #1 pcntl_fork() 示例 15 <?php 16 17 $pid = pcntl_fork(); 18 //父进程和子进程都会执行下面代码 19 if ($pid == -1) { 20 //错误处理:创建子进程失败时返回-1. 21 die('could not fork'); 22 } else if ($pid) { 23 //父进程会得到子进程号,所以这里是父进程执行的逻辑 24 pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。 25 } else { 26 //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 27 } 29 ?>
多进程
1 <?php 2 var_dump(time()); 3 $childPidList = []; 4 for ($i = 0; $i < 200; $i++) { 5 $pid = pcntl_fork(); 6 7 switch($pid) { 8 case -1: 9 exit("warn die..."); 10 break; 11 case 0: 12 //son process 13 var_dump("work out..."); 14 sleep(10); 15 break; 16 default: 17 //parent process 18 $childPidList[] = $pid; 19 break; 20 } 21 } 22 23 while(count($childPidList) > 0) { 24 foreach ($childPidList as $k => $pid) { 25 # code... 26 $ret = pcntl_waitpid($pid, $status, WNOHANG); 27 if ($ret == -1 || $ret > 0) { 28 unset($childPidList[$k]); 29 } 30 } 31 usleep(100000); 32 } 33 34 var_dump("end"); 35 var_dump(time());
如果循环调用的,按照文档内容: 在当前进程当前位置产生分支.
那么for循环下thread关系为:
简单定义如下
PT: parent thread.
ST: son thread.
pcntl_fork总是会生成一个父子成对的进程来执行。
那么循环的次数决定运行中产生总的进程数为: 2^n。比如循环3,那么总的进程数为: 2^3 = 8。
因为成对出现的特性,那么父子进程数量相同。比如循环3,按图得简单式子: 2^3 – 1 = 7。