这篇文章主要介绍了关于php多进程执行任务的说明,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
需求
对指定数量的多个任务并发执行,并控制进程数
进程&线程:
进程间相互独立,不影响。
代码示例:
<?php$task = 0; //任务id$taskNum = 10; //任务总数$processNumLimit = 2; //子进程总量限制while(true){ //产生分支 $processid = pcntl_fork(); //创建子进程失败 if( $processid == -1 ){ echo "create process error!\n"; exit(1); } //主进程,获得子进程pid elseif($processid){ $task++; //下一个任务 $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\n"; //控制进程数 if($task >= $processNumLimit) { echo "wait chl start!\n"; $exitid = pcntl_wait($status); //等待退出 echo "wait chl end!extid:",$exitid,"\tstatus:",$status,"\n"; } //任务总量控制 if($task >= $taskNum) { echo "taskNum enough!\n"; break; } } //processid=0为新创建的进程 else{ //模拟不同任务的不同执行时长 $sleep = rand(1, 5); $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!\n"; sleep($sleep); echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!\n"; exit(0); //子进程执行完后退出,防止进入循环创建子进程 }}
执行的结果:
task:1 processid:32225 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 begin!task:2 processid:32226 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 begin!task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 end!wait chl end!extid:32226 status:0task:3 processid:32228 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 begin!task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 end!wait chl end!extid:32228 status:0task:4 processid:32229 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 begin!task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 end!wait chl end!extid:32225 status:0task:5 processid:32270 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 begin!task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 end!wait chl end!extid:32229 status:0task:6 processid:32271 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 begin!task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 end!wait chl end!extid:32270 status:0task:7 processid:32273 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 begin!task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 end!wait chl end!extid:32273 status:0task:8 processid:32274 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 begin!task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 end!task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 end!wait chl end!extid:32274 status:0task:9 processid:32277 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!wait chl end!extid:32271 status:0task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 begin!task:10 processid:32278 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:9 processid:0 currentProcessid:32278 parentProcessi<i style="color:transparent">本文来源gaodai$ma#com搞$$代**码)网8</i><strong>搞代gaodaima码</strong>d:32224 phpProcessid:32278 sleep:2 begin!task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 end!task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 end!wait chl end!extid:32277 status:0taskNum enough