本篇是一个过渡篇
( 重在理解多进程 以及进程执行过程和进程执行后的数据 )
废话不多说直接上代码 运行下面代码前 可以先想想有几个进程以及$count 是多少?
<?php
// 开始多进程
$count = 10;
for ($i=0;$i<2;$i++){
epd('我是循环记数值'.$i);
$pid = pcntl_fork(); // fork进程
if ($pid == 0){
// 子进程
$count++;
epd('我是儿子'.posix_getpid().'$count='.$count);
}else{
// 父进程
$count *=10;
epd("我是父亲".posix_getpid()."我的儿子是".$pid.'$count='.$count);
// break;
}
}
while (true){
;
}
function epd($content){
echo $content."\r\n";
}
最后结果是否与你心中所想一样呢?
我第一次也理解不了
下面我放出执行分析流程
1.父进程 [ 17068 ] 执行for循环 ( 原数据:$i = 0; $count = 10; ) fork一个子进程 child1 [ 17069 ] 执行if判断 ( 新数据:$i = 1; $count = 100; )
2.子进程 child1 [ 17069 ] ( 原数据:$i = 0; $count = 10; ) 执行if判断 ( 新数据:$i = 1; $count = 11; )
3.父进程 [ 17068 ] 执行for循环 ( 原数据:$i = 1; $count = 100; ) fork一个子进程 child2 [ 17070 ] 执行if判断 ( 新数据:$i = 2; $count = 1000; )
4.子进程 child2 [ 17070 ] ( 原数据:$i = 1; $count = 100; ) 执行if判断 ( 新数据:$i = 2; $count = 101; )
5.子进程 child1 [ 17069 ] 执行for循环 ( 原数据:$i = 1; $count = 11 ) fork一个子进程 child3 [ 17071 ] 执行if判断 ( 新数据:$i = 2; $count = 110; )
6.子进程 child3 [ 17071 ] ( 原数据:$i = 1; $count = 11 ) 执行if判断 ( 新数据:$i = 2; $count = 12; )
注意点:
子进程是从fork位置向下走的
上面分析流程不代表执行循序 切记不代表 不代表 不代表 说三遍
因为进程调度是cpu决定的 所以上面流程是分析最终结果
为啥子进程还会再创建子进程?
因为子进程向下执行完之后for循环还没执行完 所以会接着走
我们改一下代码
我们让父进程fork子进程之后终止循环
<?php
// 开始多进程
$count = 10;
for ($i=0;$i<2;$i++){
epd('我是循环记数值'.$i);
$pid = pcntl_fork(); // fork进程
if ($pid == 0){
// 子进程
$count++;
epd('我是儿子'.posix_getpid().'$count='.$count);
}else{
// 父进程
$count *=10;
epd("我是父亲".posix_getpid()."我的儿子是".$pid.'$count='.$count);
break; // 父进程跳出循环
}
}
while (true){
;
}
function epd($content){
echo $content."\r\n";
}
1.父进程 [ 16206 ] 执行for循环 ( 原数据:$i = 0; $count = 10; ) fork一个子进程 child1 [ 16207 ] 执行if判断 ( 新数据:$count = 100; break;终止循环 )
2.子进程 child1 [ 16207 ] ( 原数据:$i = 0; $count = 10; ) 执行if判断 ( 新数据:$i = 1; $count = 11; )
3.子进程 child1 [ 16207 ] 执行for循环 ( 原数据:$i = 1; $count = 11; ) fork一个子进程 child2 [ 16208 ] ( 新数据: $count = 110; break;终止循环 )
4.子进程 child2 [ 16208 ] ( 原数据:$i = 1; $count = 11 ) 执行if判断 ( 新数据:$i = 2; $count = 12; )
....................
我们继续增加循环次数看看
我们再改一下代码
我们让子进程执行之后终止循环
<?php
// 开始多进程
$count = 10;
for ($i=0;$i<4;$i++){
epd('我是循环记数值'.$i);
$pid = pcntl_fork(); // fork进程
if ($pid == 0){
// 子进程
$count++;
epd('我是儿子'.posix_getpid().'$count='.$count);
break; // 子进程跳出循环
}else{
// 父进程
$count *=10;
epd("我是父亲".posix_getpid()."我的儿子是".$pid.'$count='.$count);
}
}
while (true){
;
}
function epd($content){
echo $content."\r\n";
}
1.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 0; $count = 10; ) fork一个子进程 child1 [ 4698 ] 执行if判断 ( 新数据:$count = 100; $i = 1 )
2.子进程 child1 [ 4698 ] ( 原数据:$i = 0; $count = 10; ) 执行if判断 ( 新数据:$count = 11; break;终止循环 )
3.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 1; $count = 100; ) fork一个子进程 child2 [ 4699 ] 执行if判断 ( 新数据:$count = 1000; $i = 2 )
4.子进程 child2 [ 4699 ] ( 原数据:$i = 1; $count = 100; ) 执行if判断 ( 新数据:$count = 101; break;终止循环 )
5.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 2; $count = 1000; ) fork一个子进程 child3 [ 4670 ] 执行if判断 ( 新数据:$count = 10000; $i = 3 )
6.子进程 child3 [ 4670 ] ( 原数据:$i = 2; $count = 1000; ) 执行if判断 ( 新数据:$count = 1001; break;终止循环 )
7.父进程 [ 4697 ] 执行for循环 ( 原数据:$i = 3; $count = 10000; ) fork一个子进程 child4 [ 4671 ] 执行if判断 ( 新数据:$count = 100000; $i = 4 )
8.子进程 child4 [ 4671 ] ( 原数据:$i = 3; $count = 10000; ) 执行if判断 ( 新数据:$count = 10001; break;终止循环 )
....................
让父进程终止循环进程关系就是无限极的形式
让子进程终止循环进程关系就是一个父亲和他的儿子们
文章带有局限性,重在理解,并自己手动测试下直到理解为止,因为这点确实很重要
再说一遍:
执行过程我用序号标记是分清逻辑 不代表cpu调度
进程执行顺序是由cpu决定的