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');
22else if ($pid) {
23      //父进程会得到子进程号,所以这里是父进程执行的逻辑
24      pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
25else {
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。

版权声明:本文为黑熊一只原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/supermarx/p/16591204.html